如果C++程序在链接时,不能在所有的库和目标文件内找到所引用的函数、变量或标识符,将产生此错误。一般来说,发生错误的原因是所引用的函数、变量不存在、拼写不正确或者使用错误。下面,我以工程内链接和连接库链接两种方式讨论错误出现的原因和解决错误的方法。
一,工程内链接
1,工程内函数或变量不存在
1,只声明没定义。
2,声明和定义的函数参数列表不一致。
3,函数或变量拼写错误。
2,函数或变量所在的文件没有被正确编译
1,所在的文件没有被添加到工程中。
2,函数或变量的定义放在头文件,但是该头文件并没有被任何一个cpp文件引用,注意:这种情况只会出现入口函数的链接错误。
4,预处理宏或条件编译导致函数或变量没有被正确编译。
5,如果是内联(inline)函数,必须在需要用它的每个编译单位里定义,因此定义只能放在头文件中,不可以放在CPP文件中。
二,连接库链接
1,链接的函数或变量没有被正确导出
1,类或函数没有用__declspec(dllexport)导出。
2,类或函数没有用模块定义文件def导出。
3,def文件没有被正确添加到工程中。
4,函数或变量的拼写错误导致没法正确导出。
2,找不到链接的库文件
1,工程设置中Linker->General->Additional Library Directories.
2,工程设置中Linker->Input->Additional Dependencies.
3,Tools->Options->Projects->VC++ Directories->Library files.
4,使用pragma comment(lib, "XXX.lib")
5,如果没有设置库文件和路径,可以通过设置工程依赖解决。
3,错误的调用方式
1,C和C++函数名扩展没有被正确使用(C一般为_function形式,C++一般为: ?function@@YAPAU形式)。
2,extern "C"的使用不正确。
3,函数参数调用方式不一致(__cdecl、 __stdcall、 __fastcall……)。
4,如果链接错误的是CRT库
1,试试忽略该CRT库。
2,改变运行时库(Runtime Library)链接方式,使用DLL或者静态库方式。
3,如果忽略了某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应忽略哪些特定库
5,如果链接错误的是入口函数
1,检查Linker->System->SubSystem,是win32还是console。
2,检查Linker->Advanced->Entry Point,是否使用了自定义的入口函数。
3,入口函数放在头文件中,但头文件没有被正确编译。