名称mangling和dumpbin

时间:2011-12-02 12:19:53

标签: c++ visual-c++ linker intel-mkl

昨天我正在帮朋友编译Intel's MKL Java示例。我们遇到了“未解析的外部”的问题,即使一切看起来都很好(相应的示例文件/ makefile)。

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

TL; DR

所以,我的问题是:

  1. dumpbin是否显示库中入口点的全名?或者由于某种原因它实际上“解开”这个名字?
  2. 该库随附安装包,因此我不知道使用哪个编译器进行编译。不同的编译器会产生不同的名称吗?
  3. 我真的不认为我做对了;我可能在其他地方做错了什么,但我想确定这两个问题。

    没有答案的类似问题是here

1 个答案:

答案 0 :(得分:2)

  1. dumpbin将在库中显示符号的全名(不在源中),不做任何更改。对于MS编码的C ++名称,它将在括号中显示原始符号(如果它可以找出原始符号)。 (用dumpbin 9.00.21022.08测试)

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

  3. 以下是关于name mangling的维基百科文章。