“无法解析的外部符号”有可能是没有extern "C"造成的
2013-10-05 12:52
387 查看
我在CSDN论坛上发帖得到解决方法,地址:http://bbs.csdn.net/topics/390606270
还参考了别人的文章,http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html
搭建环境时经常碰到”无法解析的外部符号“这个问题,该如何解决?以前就是检查DLL,LIB,INCLUDE等设置,如果还是不行,就没办法了。这次学到了新方法。
这次出现以下错误
1>main.obj : error LNK2019: 无法解析的外部符号 "long __stdcall McammSetBinning(long,long)" (?McammSetBinning@@YGJJJ@Z),该符号在函数 _main 中被引用
检查所有配置,都是正确的。
用dumpbin查看lib以及dll文件(查看方法见之前的文章),lib里面有函数_McammSetBinning@8
到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin目录下
执行命令:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin>undname ?McammSetBinn
ing@@YGJJJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?McammSetBinning@@YGJJJ@Z"
is :- "long __stdcall McammSetBinning(long,long)"
我只是想说,这下总算明白 "long __stdcall McammSetBinning(long,long)"
和(?McammSetBinning@@YGJJJ@Z)什么关系了,它们是对应的,只不过一个给人看的,一个给程序看的。
为什么调用McammSetBinning函数,VS中生成的函数名是?McammSetBinning@@YGJJJ@Z,而lib中存储的函数名是_McammSetBinning@8?
这是因为lib是C用语言的语法编译的,而VS中的编译器用的是C++的编译器。
_McammSetBinning@8中,@8的意思是变量有8字节。
?McammSetBinning@@YGJJJ@Z中,@@YGJJJ@Z的意思是,有两个long变量,由于C++要处理重载,所以必须存储变量的类型。
解决方法很简单,只需要的include的文件中,函数前加入extern
"C"或者整个文件用extern "C"{}包括起来,就可以了。
还参考了别人的文章,http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html
搭建环境时经常碰到”无法解析的外部符号“这个问题,该如何解决?以前就是检查DLL,LIB,INCLUDE等设置,如果还是不行,就没办法了。这次学到了新方法。
这次出现以下错误
1>main.obj : error LNK2019: 无法解析的外部符号 "long __stdcall McammSetBinning(long,long)" (?McammSetBinning@@YGJJJ@Z),该符号在函数 _main 中被引用
检查所有配置,都是正确的。
用dumpbin查看lib以及dll文件(查看方法见之前的文章),lib里面有函数_McammSetBinning@8
到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin目录下
执行命令:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin>undname ?McammSetBinn
ing@@YGJJJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?McammSetBinning@@YGJJJ@Z"
is :- "long __stdcall McammSetBinning(long,long)"
我只是想说,这下总算明白 "long __stdcall McammSetBinning(long,long)"
和(?McammSetBinning@@YGJJJ@Z)什么关系了,它们是对应的,只不过一个给人看的,一个给程序看的。
为什么调用McammSetBinning函数,VS中生成的函数名是?McammSetBinning@@YGJJJ@Z,而lib中存储的函数名是_McammSetBinning@8?
这是因为lib是C用语言的语法编译的,而VS中的编译器用的是C++的编译器。
_McammSetBinning@8中,@8的意思是变量有8字节。
?McammSetBinning@@YGJJJ@Z中,@@YGJJJ@Z的意思是,有两个long变量,由于C++要处理重载,所以必须存储变量的类型。
解决方法很简单,只需要的include的文件中,函数前加入extern
"C"或者整个文件用extern "C"{}包括起来,就可以了。
相关文章推荐
- VS2013+Qt环境,库引入与调用方法
- Qt遇到链接问题
- 图像处理结果
- [CF 351A]Jeff and Rounding[greedy]
- MmReMapSpace
- JBoss 系列三:使用4种方式部署应用到JBoss7/WildFly
- eclipse debug时的display视图
- Children of the Candy Corn
- 复杂点的查询
- Cursor 引起的android程序崩溃异常解决方法
- 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)
- IT界需求最旺的16项技能
- 4-3
- strace使用详解
- c++中多线程编程是不是线程数越多越好?
- 利用lua_pcall()的errfunc参数调试LUA程序
- #ifndef、#define、#endif
- 一个简单的c++写日志类
- Java heap dump触发和分析(转)
- 快排为什么那样快