“error LNK2019: 无法解析的外部符号”之分析
2016-06-01 21:07
323 查看
http://www.cnblogs.com/hiloves/p/4678848.html
这种错误的本质是链接器无法在已编译的obj、lib或dll文件中找到函数定义。
我遇到的问题是c和c++混编。
你自己写的函数声明的头文件也写了函数定义的cpp文件也加入工程了而且你很确定函数体肯定是在这个库文件中,却依然出现LNK2019错误。可能原因:C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用C++规则的函数名去找结果就找不到了,而你还百般肯定TM的不就在这个库中吗你个睁眼瞎。解决:在C语言的头文件中加入
给链接器提示这个函数是C语言的,别TM找错了。
这种错误的本质是链接器无法在已编译的obj、lib或dll文件中找到函数定义。
我遇到的问题是c和c++混编。
你自己写的函数声明的头文件也写了函数定义的cpp文件也加入工程了而且你很确定函数体肯定是在这个库文件中,却依然出现LNK2019错误。可能原因:C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用C++规则的函数名去找结果就找不到了,而你还百般肯定TM的不就在这个库中吗你个睁眼瞎。解决:在C语言的头文件中加入
#ifdef __cplusplus extern "C" { #endif void readRegmark(char *regmark); //这里写函数声明 #ifdef __cplusplus } #endif
给链接器提示这个函数是C语言的,别TM找错了。
相关文章推荐
- Java 中 List 元素排序
- ubuntu安装下载好的jdk
- python 文件1
- UNREFERENCED_PARAMETER作用
- 飞机游戏软件 150206305
- CodeForces 624A Save Luke神庙大逃亡(暑期小练习)
- c++中的成员访问级别和派生继承方式
- 九度 题目1176:树查找
- 创建cookie,慢慢更~
- 为何有了组件, 还要有微服务?
- JAVA基础再回首(一)——基本概念、JAVA开发工具、JAVA基本语法
- 不使用中间变量交换两数
- java6.01学习笔记TCPServer
- delegate和protocol
- Android旋转图片
- 自学git(一)
- Linux下的TCP/IP编程----进程及多进程服务端
- 【刷题之路】不使用额外空间交换两个数
- spring_helloworld
- android产品研发(三)-->基类Activity