您的位置:首页 > 其它

“无法解析的外部符号”有可能是没有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"{}包括起来,就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  库调用 链接问题