2011-12-02 41 views
0

昨天我帮朋友编译Intel's MKL Java示例。我们遇到了“未解决的外部事件”问题,尽管一切都很顺利(相应于示例文件/ makefile)。名称mangling和dumpbin

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

TL; DR

所以,我的问题是:

  1. 是否dumpbin显示在库的入口点的全名?或者出于某种原因,它实际上“取消了”这个名字?
  2. 该库附带安装包,所以我不知道使用哪个编译器进行编译。不同的编译器会生成不同的名称吗?

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

一个类似的问题没有答案是here

+0

听起来你想链接Fortran版本。 –

+0

@HansPassant,你能详细说说...吗? –

回答

1
  1. dumpbin将显示在库(而不是源)符号的全名,没有任何交替。对于C++名称受到损坏的MS,它将在括号中显示原始符号(如果它可以计算出原始符号)。 (使用dumpbin 9.00.21022.08进行测试)

  2. 不同的编译器确实会生成不同的符号,特别是对于C++符号。对于符号,编译器倾向于对名称修改达成一致,所以extern "C"符号可以链接到不同的编译器之间。

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

+0

感谢您的信息!毕竟,我会试图弄清楚图书馆是否存在问题。 –