1

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

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

TL;博士

所以,我的问题是:

  1. 是否dumpbin显示库中入口点的全名?或者由于某种原因它实际上“解开”了这个名字?
  2. 这个库是自带安装包的,所以不知道是用哪个编译器编译的。不同的编译器会产生不同的名称吗?

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

这里有一个没有答案的类似问题。

4

1 回答 1

2
  1. dumpbin将在库中(不在源中)显示符号的全名,没有任何交替。对于 C++ 名称混乱的 MS,它将在括号中显示原始符号(如果它可以找出原始符号)。(使用垃圾箱 9.00.21022.08 测试)

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

这是一篇关于name mangling的维基百科文章。

于 2011-12-02T12:47:48.460 回答