习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错误虽然比较困难,但是只要注意到了上述问题,还是能
够避免和予以解决的。

作者:kugoo

LNK 2001错误相关推荐

  1. LNK 2001错误 原因以及解决办法

    以下是我遇到的情况,并且给出我的解决方案,希望对您有帮助. LNK2001错误 错误 LNK2001 无法解析的外部符号 "private: static class GameManager ...

  2. LNK 2001 的错误

    这个错误一般情况下指代你的链接库有问题,也就是说,要么是你的类方法没有实现,要么是你头文件改动后没有重新编译 今天遇到的错误是 error LNK2001: 无法解析的外部符号 "publi ...

  3. error LNK 2001的几种情况和解决方案

    VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过.产生连接错误的原因非常多,尤其LNK2001错误,常 ...

  4. ERROR LNK 2001||2019

    关于这两个错误 首先必须明白链接是为了将目标文件与类库文件链接 所以这种错误 多半是无法找到类库文件 "error LNK2001: unresolved external symbol&q ...

  5. MFC LNK 2005错误

    为什么会出现这个错误??"error LNK2005: 已经在*.obj中定义"  编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错 ...

  6. LNK 2001:无法解析的外部符号 _sprintf

    第三方库内使用了printf和scanf等较老的接口,在较新的VS开发环境中已经废弃,所以无法链接到对应的接口,因此解决此问题只需添加printf等函数的接口库即可. 在文件头添加 :#pragma ...

  7. c, c++函数名编译符号修饰符说明

    C++ 编译器的函数名修饰规则 函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串.用来指明函数的定义或原型. LIN ...

  8. opengl纹理示例

    一 一个简单例子 首先做一个简单例子:绘制一个简单的二维纹理图,并将该图像映射到一个四边形上:代码: #include <stdlib.h> #include <GL/glut.h& ...

  9. [转][C/C++]函数名字修饰(Decorated Name)方式

    1.C/C++函数修饰名: 对于我们的C/C++源程序而言,函数名只是函数的一小部分,函数还有调用方式(参数入栈方式).返回值类型.参数个数和各参数类型等信息,对于C++类成员函数,还有更多信息.这些 ...

最新文章

  1. 教育部办公厅关于2020-2021学年面向中小学生的全国性竞赛活动名单的公示
  2. D2Admin 7月份更新内容:cli3以及更方便的全局控制等
  3. 刚毕业的我,参与了一场大厂之间的争夺之战
  4. string截取某个字符串之前的_python String字符串操作
  5. mybatis jdbctype数据类型_mybaits-mybatis配置
  6. 3、leetcode35 搜索插入位置**
  7. 基于springboot2.x集成缓存注解及设置过期时间
  8. Yii 之分页 + bootstrap
  9. SPOJ1811最长公共子串问题(后缀自动机)
  10. python合并excel工作簿_Python合并多个Excel工作簿
  11. canvas笔记-阴影的使用
  12. 近67万辆奔驰汽车被召回,涉及C级、SLC级等车型
  13. 【Spring】Spring事务失效的 8 大原因
  14. 《大数据导论》——2.3节业务流程管理
  15. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
  16. 利用IP纯真数据库查询地址
  17. 通信原理 AMI码和HDB3码的编码方式
  18. 《计算机场地安全要求》最新版,计算机场地安全要求gb936200x.doc
  19. ubuntu大小写切换键的使用
  20. 迅雷7计算机丢失xlfsio.dll,求大神帮忙,迅雷7出现的崩溃问题

热门文章

  1. 如何用快慢指针在链表找到中间点
  2. 快慢指针慢指针和快指针一定会相遇
  3. 老码农眼中的大模型(LLM)
  4. FusionCharts基本使用
  5. java利用redis的setIfAbsent和incr,实现自增,限制总数
  6. css【详解】grid布局—— 网格布局(栅格布局)
  7. 将大写字母转化为小写字母
  8. VisualSVN Server安装失败解决
  9. 流量变现的10种方式
  10. 2021消防设施操作员(中级)岗位考试真题安全检查知识部分