链接错误(error LINK2019、LINK2001: 无法解析的外部符号)有如下可能:
一、代码本身错误
1,工程内函数或变量不存在:只声明没定义,声明和定义的函数参数列表不一致,函数或变量拼写错误,类成员函数在定义时忘了写类名变成了全局函数。
2,函数或变量所在的文件没有被正确编译:所在的文件没有被添加到工程中,函数或变量的定义放在头文件,但是该头文件并没有被任何一个cpp文件引用(注意:这种情况只会出现入口函数的链接错误),预处理宏或条件编译导致函数或变量没有被正确编译,如果是内联(inline)函数,必须在需要用它的每个编译单位里定义,因此定义只能放在头文件中,不可以放在CPP文件中。
3,如果链接错误的是入口函数:检查Linker->System->SubSystem,是win32还是console,检查Linker->Advanced->Entry Point,是否使用了自定义的入口函数,入口函数放在头文件中,但头文件没有被正确编译。
4. 类的静态成员变量在.h文件中声明了,没有在.cpp文件中实现(注意,初始化需要在这里,即便不需要初始化也要在这里实现)。
二、导出错误
5,链接的函数或变量没有被正确导出:类或函数没有用__declspec(dllexport)导出,类或函数没有用模块定义文件def导出,def文件没有被正确添加到工程中,函数或变量的拼写错误导致没法正确导出。
三、工程配置错误
6,找不到链接的库文件:工程设置中Linker->General->Additional Library Directories,工程设置中Linker->Input->Additional Dependencies,Tools->Options->Projects->VC++ Directories->Library files,使用pragma comment(lib, “XXX.lib”),如果没有设置库文件和路径,可以通过设置工程依赖解决。
7. 如果整个cpp看起来没有编译,那么很有可能是在使用了预编译头的情况下cpp文件没有写#include “stdafx.h”。
8. 整个cpp看起来没有编译,也不是预编译头的问题,并且在cpp中随便写一些不符合语法的东西也不报错,那有可能文件虽然被VS打开了,但是没有放到VS的工程中,还有很小的可能明明显示在VS工程中,但是实际却不再,删除再重新添加也许就好了。
四、各种不一致导致的错误
9,错误的调用方式:C和C++函数名扩展没有被正确使用(C一般为_function形式,C++一般为: ?function@@YAPAU形式),extern “C”的使用不正确,函数参数调用方式不一致(__cdecl、 __stdcall、 __fastcall……),两个库使用Unicode和ANSI不一致。
10,如果链接错误的是CRT库:试试忽略该CRT库,改变运行时库(Runtime Library)链接方式,使用DLL或者静态库方式,如果忽略了某CRT库,检查运行时库(Runtime Library),并保持调用的一致性。(http://msdn.microsoft.com/en-us/library/aa278396(v=vs.60).aspx /MD, /ML, /MT, /LD说明,http://msdn.microsoft.com/en-us/library/aa267384(v=vs.60).aspx 使用不同的crt应忽略哪些特定库)
11. 库中有的函数有链接错误、有的没有,并且确定连接错误的函数本身也没有问题,那就很可能是32位64位不兼容、VS版本不兼容,不会提示打开lib文件失败,但是会有一大堆的链接错误。