名称mangling和垃圾箱

Name mangling and dumpbin

本文关键字:垃圾箱 mangling 名称      更新时间:2023-10-16

昨天我正在帮助一个朋友编译英特尔的MKL Java示例。我们遇到了"未解决的外部"问题,尽管一切看起来都很好(根据示例文件/makefile)。

然后我使用Visual Studio的dumpbin检查库中是否存在未解析的函数。一个无法解析的外部函数的例子是一个叫做_cblas_sgemm的函数。当从库(dumpbin /symbols mkl_core.lib)中转储符号时,我只能在库上找到一个函数cblas_sgemm,它错过了前缀_。然后我发现这个函数实际上只被称为cblas_sgemm,并且编译器添加了_前缀,作为名称混淆规则的一部分。

TL;博士

我的问题是:

  1. dumpbin是否显示库中入口点的全名?或者出于某种原因,它实际上"解开"了这个名字?
  2. 这个库是和安装包一起来的,所以我不知道是用哪个编译器来编译的。不同的编译器产生不同的名字吗?

我真的不认为我做对了;我可能在其他地方做错了什么,但我想确定这两个问题。

还有一个类似的问题没有答案

  1. dumpbin将显示库中(而不是源代码中)符号的全名,没有任何更改。对于c++名称,它将在括号中显示原始符号(如果它能找出原始符号)。

  2. 不同的编译器会生成不同的符号,尤其是c++符号。对于符号,编译器倾向于对名称混淆达成一致,因此extern "C"符号可以在不同的编译器之间链接。

这是维基百科关于名称混淆的文章。