VS编译报错link2019

VS编译报错link2019

vs在编译的时候,报错: error LNK2019: unresolved external symbol,通常有以下几种情况会出现此类问题:
1.没有添加lib:
添加方法一:#pragma comment(lib,“XXXX.lib”)
添加方法二:工程属性中添加lib路径+input输入lib名称
General
Input
2.lib版本和编译器版本不对应,比如32位lib,编译器X64也会导致link2019错误,更换对应版本的lib即可。

3.添加了CPP文件到SRC中,但是工程中没有添加源文件的代码也会导致link错误。

如何系统排查 LNK2019 错误

当遇到 LNK2019 错误时,可以按照以下步骤进行排查:

1. 确认缺失的符号

首先,仔细阅读错误信息。它会明确指出是哪个函数或变量(符号)无法解析。例如:

error LNK2019: unresolved external symbol "void __cdecl myFunction(int)" (?myFunction@@YAXH@Z) referenced in function _main

这告诉我们 myFunction(int) 这个函数没有找到定义。

2. 检查对应的源文件或库

  • 如果是项目内的函数/类:检查包含该函数声明的头文件(.h)所对应的源文件(.cpp)是否已经添加到项目中并参与编译。
  • 如果是外部库的函数
    • 确认库文件已添加:使用上文提到的两种方法之一,确保 .lib 文件已正确链接。
    • 检查库路径:在项目属性 -> 链接器 -> 常规 -> 附加库目录中,确保包含了 .lib 文件所在的目录。
    • 检查库名:在项目属性 -> 链接器 -> 输入 -> 附加依赖项中,确保输入的库文件名(如 XXXX.lib)完全正确,包括后缀。

3. 检查函数声明与定义是否一致

这是非常常见的原因。请确保:

  • 调用约定一致:例如,函数声明为 __stdcall,但定义却是 __cdecl
  • 名称修饰(Name Mangling):C++ 编译器会对函数名进行修饰以包含参数和返回类型信息。如果使用 extern "C" 声明了一个函数,但在定义时没有用 extern "C" 包裹,就会导致修饰名不匹配。确保声明和定义的 extern "C" 使用一致。
  • 参数类型和数量完全一致

4. 检查运行时库(Runtime Library)设置

项目属性 -> C/C++ -> 代码生成 -> 运行时库 的设置必须一致。如果一个库是用 /MT(静态链接)编译的,而你的主项目设置为 /MD(动态链接),就可能引发 LNK2019。确保所有引用的库和你的主项目使用相同的运行时库设置。

5. 检查平台(x86/x64)匹配

正如文章前面提到的,确保你链接的库文件(.lib)的位数(32位或64位)与你的项目目标平台(Win32 或 x64)完全一致。64位项目必须链接64位的库。

6. 清理并重新生成

有时编译中间文件(.obj)或预编译头(.pch)可能已损坏。尝试执行 “生成 -> 清理解决方案”,然后 “生成 -> 重新生成解决方案”

7. 查看库的导出符号(高级)

如果怀疑库文件本身有问题,可以使用 Visual Studio 自带的 dumpbin.exe 工具查看库中导出了哪些符号:

  1. 打开 “VS开发人员命令提示符”
  2. 切换到你的 .lib 文件所在目录。
  3. 运行命令:dumpbin /exports YourLibName.lib
  4. 在输出中搜索你缺失的那个符号名,确认它是否真的被库导出。

通过以上步骤,绝大多数 LNK2019 链接错误都能被定位并解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值