VS编译报错link2019
vs在编译的时候,报错: error LNK2019: unresolved external symbol,通常有以下几种情况会出现此类问题:
1.没有添加lib:
添加方法一:#pragma comment(lib,“XXXX.lib”)
添加方法二:工程属性中添加lib路径+input输入lib名称


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 工具查看库中导出了哪些符号:
- 打开 “VS开发人员命令提示符”。
- 切换到你的
.lib文件所在目录。 - 运行命令:
dumpbin /exports YourLibName.lib - 在输出中搜索你缺失的那个符号名,确认它是否真的被库导出。
通过以上步骤,绝大多数 LNK2019 链接错误都能被定位并解决。

2245

被折叠的 条评论
为什么被折叠?



