学习VC++时常常会遇到连接错误LNK2001,该错误很是讨厌,由于对于 编程者来讲,最好改的错误莫过于编译错误,而通常说来发生链接错误时, 编译都已经过。产生链接错误的缘由很是多,尤为LNK2001错误,经常令人不 明其因此然。若是不深刻地学习和理解VC++,要想改正链接错误LNK2001非 常困难。 初学者在学习VC++的过程当中,遇到的LNK2001错误的错误消息主要为: unresolved external symbol “symbol”(不肯定的外部“符号”)。 若是链接程序不能在全部的库和目标文件内找到所引用的函数、变量或 标签,将产生此错误消息。通常来讲,发生错误的缘由有两个:一是所引用 的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不一样版本 的链接库。 如下是可能产生LNK2001错误的缘由: 一.因为编码错误致使的LNK2001。 1.不相匹配的程序代码或模块定义(.DEF)文件能致使LNK2001。例如, 若是在C++ 源文件内声明了一变量“var1”,却试图在另外一文件内以变量 “VAR1”访问该变量,将发生该错误。 2.若是使用的内联函数是在.CPP文件内定义的,而不是在头文件内定 义将致使LNK2001错误。 3.调用函数时若是所用的参数类型同函数声明时的类型不符将会产生 LNK2001。 4.试图从基类的构造函数或析构函数中调用虚拟函数时将会致使LNK2001。 5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。 静态函数和静态变量具备相同的使用范围限制。当试图从文件外部访问 任何没有在该文件内声明的静态变量时将致使编译错误或LNK2001。 函数内声明的变量(局部变量) 只能在该函数的范围内使用。 C++ 的全局常量只有静态链接性能。这不一样于C,若是试图在C++的 多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是须要时在 头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另外一种 方法是使用时给该变量赋以常数。 二.因为编译和连接的设置而形成的LNK2001 1.若是编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所须要的运行 库和MFC库在链接时由编译器写入目标文件模块, 但除非在文件中明确包含 这些库名,不然这些库不会被连接进工程文件。在这种状况下使用/NOD将导 致错误LNK2001。 2.若是没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC 时将获得“unresolved external on _WinMain@16”的LNK2001错误信息。 3.使用/MD选项编译时,既然全部的运行库都被保留在动态连接库以内, 源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。 若是试图使用静态库LIBC.LIB或LIBCMT.LIB进行链接,将在__imp__func上发 生LNK2001;若是不使用/MD选项编译,在使用MSVCxx.LIB链接时也会发生LNK2001。 4.使用/ML选项编译时,如用LIBCMT.LIB连接会在_errno上发生LNK2001。 5.当编译调试版的应用程序时,若是采用发行版模态库进行链接也会产 生LNK2001;一样,使用调试版模态库链接发行版应用程序时也会产生相同的 问题。 6.不一样版本的库和编译器的混合使用也能产生问题,由于新版的库里可 能包含早先的版本没有的符号和说明。 7.在不一样的模块使用内联和非内联的编译选项可以致使LNK2001。若是 建立C++库时打开了函数内联(/Ob1或/Ob2),可是在描述该函数的相应头 文件里却关闭了函数内联(没有inline关键字),这时将获得该错误信息。 为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。 8.不正确的/SUBSYSTEM或/ENTRY设置也能致使LNK2001。 其实,产生LNK2001的缘由还有不少,以上的缘由只是一部分而已,对初 学者来讲这些就够理解一阵子了。可是,分析错误缘由的目的是为了不错 误的发生。LNK2001错误虽然比较困难,可是只要注意到了上述问题,仍是能 够避免和予以解决的。