名称mangling和垃圾箱
Name mangling and dumpbin
昨天我正在帮助一个朋友编译英特尔的MKL Java示例。我们遇到了"未解决的外部"问题,尽管一切看起来都很好(根据示例文件/makefile)。
然后我使用Visual Studio的dumpbin检查库中是否存在未解析的函数。一个无法解析的外部函数的例子是一个叫做_cblas_sgemm
的函数。当从库(dumpbin /symbols mkl_core.lib
)中转储符号时,我只能在库上找到一个函数cblas_sgemm
,它错过了前缀_
。然后我发现这个函数实际上只被称为cblas_sgemm,并且编译器添加了_
前缀,作为名称混淆规则的一部分。
TL;博士
我的问题是:
-
dumpbin
是否显示库中入口点的全名?或者出于某种原因,它实际上"解开"了这个名字? - 这个库是和安装包一起来的,所以我不知道是用哪个编译器来编译的。不同的编译器产生不同的名字吗?
我真的不认为我做对了;我可能在其他地方做错了什么,但我想确定这两个问题。
还有一个类似的问题没有答案
-
dumpbin
将显示库中(而不是源代码中)符号的全名,没有任何更改。对于c++名称,它将在括号中显示原始符号(如果它能找出原始符号)。 -
不同的编译器会生成不同的符号,尤其是c++符号。对于符号,编译器倾向于对名称混淆达成一致,因此
extern "C"
符号可以在不同的编译器之间链接。
这是维基百科关于名称混淆的文章。