【问题标题】:Avoid name mangling on a shared object C interface under linux避免在 linux 下对共享对象 C 接口进行名称修改
【发布时间】:2012-05-25 15:42:40
【问题描述】:

在 windows 下,我们有一个 C 接口 (extern "C" { // interface }) 到我们的 C++ 库,它使用模块定义文件 (.def) 导出未修改的函数。

我正在尝试在 linux 下重新创建相同的东西,我相对缺乏经验。据我了解,在 NIX 系统下,所有功能都是默认导出的。考虑到这一点,我创建了一个共享对象,并通过 nm 命令运行。

我很惊讶地发现,与 Windows 不同的是,我的函数名称被破坏了!

请问如何防止这种情况发生?

【问题讨论】:

  • @pmg - 抱歉,我已经修改了问题。
  • 您确定不只是想编译一个共享库,然后将您的主程序链接到它吗?您在 windows 中通过 .def 文件执行的基本功能在此处自动完成。
  • gcc -x c 可能吗?来自 [这里][1] 上的答案 :) [1]:stackoverflow.com/questions/4216247/…
  • 你的问题对我来说毫无意义。例如,如果您将函数 myfunc(double) 声明为 extern "C" 实现该函数的代码已看到该定义,那么它将不会在目标文件。
  • 我认为我们需要一个小而完整的extern "C" { //interface } 示例。你不应该有这个问题。

标签: c++ c linux shared-objects name-mangling


【解决方案1】:

通常的解决方案是声明函数extern "C"。这不仅会导致名称像在 C 中那样被破坏,而且还会导致函数使用 C 调用约定。

【讨论】:

  • @James - 感谢您的回复,我们使用的是外部“C”,这就是我所说的“C 接口”的意思。我已经更新了问题以使这一点更清楚。
  • @ScarletAmaranth 这取决于 C 编译器。从历史上看,大多数 C 编译器确实会修改外部名称,但方式非常非常简单(最常见的前缀是 _)。
  • @dangerousdave 如果函数声明为extern "C",则名称应该与 C 函数完全一样。在 Linux 下使用 g++,这意味着没有修改;对于大多数 Unix 编译器,这意味着只是在名称前加上 _
  • @R 我不确定它有什么令人困惑和误导的地方。标准的要求是函数看起来就像用 C 编写的一样。这意味着必须使用与 C 中相同的修饰(以及我使用的大多数 C 编译器 do mangle) .
  • @JamesKanze o_O ? C实际上用来破坏外部名称?好吧,这对我来说是新闻,我为评论道歉! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
相关资源
最近更新 更多