【问题标题】:Name mangling and dumpbin名称修改和垃圾箱
【发布时间】:2011-12-02 12:19:52
【问题描述】:

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

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

TL;DR

所以,我的问题是:

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

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

没有答案的类似问题是here

【问题讨论】:

  • 听起来你正在尝试链接 Fortran 版本。
  • @HansPassant,你能详细说明一下吗...?

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


【解决方案1】:
  1. dumpbin 将在库中(不在源中)显示符号的全名,没有任何变化。对于 MS 错位的 C++ 名称,它将在括号中显示原始符号(如果它可以找出原始符号)。 (使用垃圾箱 9.00.21022.08 测试)

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

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

【讨论】:

  • 感谢您的信息!毕竟,我会试着弄清楚图书馆是否有问题。
猜你喜欢
  • 1970-01-01
  • 2013-11-03
  • 2016-05-22
  • 1970-01-01
  • 2018-04-17
  • 2019-03-15
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多