关于error LNK2019

7 篇文章 0 订阅

error LNK2019: 无法解析的外部符号 该符号在函数 中被引用

例如“error LNK2019: 无法解析的外部符号
error LNK2001: 无法解析的外部符号“private: static struct _OVERLAPPED CUsbCom::g_WriteOverlapped”

应该是工程设置的问题 没有连接相应的lib库或者是所用到的函数没定义(这个定义是在别的类里面的)

当出现error LNK2001: 无法解析的外部符号 _print_interface   log.obj      可在log.c里搜print_interface(无前面_),找到此函数,看有无定义学习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错误虽然比较困难,但是只要注意到了上述问题,还是能够避免和予以解决的。

既然编译通过了,就说明了没有语法错误,不用在代码中死抠语法了。从错误中提示中找原因吧。

一般问题出在

(1)XXX.lib头文件,这个要包含(不然编译也不能通过)

(2)需要XXX.lib或XXX.dll库。手动添加,项目->属性->配置属性->链接器->输入 然后在附件依赖项添加XXX.lib,再生成第一个无法解析的外部符号错误消失了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LNK2019错误通常与链接器有关,表示无法解析外部符号。 这通常是因为代码中引用了某个函数或变量,但没有正确地链接到相应的库文件或对象文件中。 解决此问题的方法包括: 1. 确保你的代码正确链接到所需的库文件或对象文件。 2. 确保你的代码正确引用所需的函数或变量。 3. 确保你的代码中没有重复定义的符号。 4. 如果你使用的是 Visual Studio,可以尝试清除解决方案并重新生成。 如果以上方法都不起作用,你可以尝试在搜索引擎上查找其他解决方案,或者向相关论坛或社区寻求帮助。 ### 回答2: error LNK2019是一个与链接器相关的错误,通常发生在编译期间。该错误表明链接器找不到某个符号的定义,也就是在编译时找不到符号的实现部分。我来简单解释一下这个错误。 当我们编写程序时,通常会把程序分为多个源文件,每个源文件包含一些函数或变量的定义。在编译过程中,每个源文件会被编译成一个目标文件(.obj或.o),然后链接器会将这些目标文件合并成最终的可执行文件。 当我们在某个源文件中调用了另一个源文件中的函数或变量时,编译器会在链接器阶段查找该函数或变量的定义。如果找不到,就会报错error LNK2019。 解决这个错误的办法通常有以下几种: 1. 检查函数或变量的声明和定义是否一致:在调用函数或使用变量之前,需要确保其在当前源文件中有正确的声明。另外,要确保该函数或变量的定义在某个源文件中。 2. 对于函数重载,要使用正确的函数签名:如果有多个重载函数,要确保在调用时使用正确的函数签名。链接器无法识别重载函数的参数类型和返回类型,因此必须使用准确的函数签名。 3. 检查是否缺少相关库文件或链接选项:如果调用的函数或变量定义在外部库文件中,需要在链接时加上对应的库文件或链接选项。确保编译器能够找到所需的库文件。 总结一下,error LNK2019是一个链接器错误,通常表明在编译期间找不到符号的定义。解决方法主要是检查函数或变量的声明和定义是否一致,使用正确的函数签名,以及确保有正确的库文件或链接选项。希望对您有帮助! ### 回答3: error LNK2019是Visual Studio编译器常见的链接错误之一。该错误表明在链接过程中找不到特定函数或符号的定义。 常见的原因包括以下几点: 1. 函数或符号的定义缺失:在使用某个函数或符号之前,需要确保其有正确的定义。如果定义缺失或者链接到错误的定义,就会出现LNK2019错误。解决方法是在正确的位置添加函数或符号的定义。 2. 函数或符号的声明与定义不一致:如果一个函数或符号的声明与其实际定义不一致,也会导致LNK2019错误。例如,函数的参数类型、返回值类型或函数名不匹配。要解决该问题,需要确保声明和定义的一致性。 3. 编译器选项不正确:编译器选项的设置可能导致链接错误。例如,如果将C++代码编译为C代码,或者使用了错误的运行时库选项,都可能导致LNK2019错误。需要检查编译器选项,并根据实际情况进行修正。 4. 函数或符号在不同的目标文件中定义:如果一个函数或符号在多个目标文件中定义,链接器将无法确定使用哪个定义。在这种情况下,需要确保只有一个定义,并将其他定义标记为外部链接。 综上所述,解决LNK2019错误的方法包括添加正确的定义、确保声明与定义一致、检查编译器选项和消除重复定义。通过仔细检查这些因素,我们可以解决LNK2019错误并顺利完成编译和链接过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值