博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转] “error LNK2019: 无法解析的外部符号”之分析
阅读量:6291 次
发布时间:2019-06-22

本文共 1261 字,大约阅读时间需要 4 分钟。

原文

最近在用VS 2008开发,初学遇到不少问题,最头疼的问题之一就是:LNK2019。

百度一下讲的并不够全面,反正都没解决我的问题。

error LNK2019问题在VC 6.0中是error LNK2001: unresolved external symbol问题,可能错误号改了。

编译时出现类似这样的错误:Dlgcode.obj : error LNK2019: 无法解析的外部符号 _readRegmark,该符号在函数 _AboutDlgProc@16 中被引用。这种错误的本质是链接器无法在已编译的obj、lib或dll文件中找到函数定义。

1、这是百度找到的方法:。就是有头文件(有了函数声明)却没有lib。一般出现于你使用了第三方提供的库,下载了头文件却忘了载库文件,或库文件忘记放到相应的目录下了。

2、你自己写的函数声明的头文件也写了函数定义的cpp文件,却依然出现LNK2019错误。可能原因:忘记将这两个文件加入工程了。一般出现于用 Visual Studio和记事本(或UltraEdit)混合开发过程,你用记事本include了相应的头文件,却忘了在Visual Studio的工程中加入它们了。也可能出现于在解决方案的开发过程,在解决方案下的某个工程中加入了它们却忘了在其他工程中加入,我只接触过VC 6和VS 2008,中间好多年没用过新版本VS,到2008时突然发现怎么多了个“解决方案”,“解决方案”下面还可以放好多工程,于是经常在一个工程中写了共享 的源代码,却忘了在别的工程中加入它们。这个问题类似于第1个,不同的是这个库是你自己提供的,但没有把它交给VS 2008编译出来。

3、你自己写的函数声明的头文件也写了函数定义的cpp文件也加入工程了而且你很确定函数体肯定是在这个库文件中,却依然出现LNK2019错误。 可能原因:C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用 C++规则的函数名去找结果就找不到了,而你还百般肯定TM的不就在这个库中吗你个睁眼瞎。解决:在C语言的头文件中加入

#ifdef __cplusplusextern "C" {#endifvoid readRegmark(char *regmark);  //这里写函数声明#ifdef __cplusplus}#endif

 

给链接器提示这个函数是C语言的,别TM找错了。

4、这是我百度来的,姑且也放进来。。模板声明和实现要放在同一文件夹中。

5、也是百度来的。。内联函数定义在头文件中。

6、百度的。。错误的工程类型造成的。

7、貌似还有不尽之处。。

 

转载地址:http://rwkta.baihongyu.com/

你可能感兴趣的文章
python基础学习笔记
查看>>
shell编程
查看>>
MongoDB 主从同步设置
查看>>
百度地图之控件
查看>>
js keycode大全
查看>>
颜色空间系列4: RGB和YDbDr颜色空间的转换及优化算法
查看>>
Unity C# 设计模式(七)适配器模式
查看>>
Lancel sac négociation avec insistance que nous pourrions réaliser de quelle route
查看>>
空白表单提交到后台的数据类型总结(java)
查看>>
Vue问题区
查看>>
[原]Unity3D深入浅出 - Shader基础开发
查看>>
netty之ByteBuf详解
查看>>
数据泵导出oracle 10g数据库
查看>>
LYSE-模块
查看>>
Date Picker和UITool Bar控件简单介绍
查看>>
sql server 实现多表连接查询
查看>>
HTTP 1.1与HTTP 1.0的比较
查看>>
如何在命令行脚本中启动带参数的Windows服务
查看>>
abstract vs interface
查看>>
nodejs笔记1 ----关于express不是本地命令
查看>>