【问题标题】:Why function's names change after compiling a shared library? [duplicate]为什么编译共享库后函数的名称会发生​​变化? [复制]
【发布时间】:2016-08-01 16:20:13
【问题描述】:

lib.c 包含:

#include <stdio.h>
void testFunction()
{
    printf("This is the testFunction from lib.so");
}

我用这个命令编译了文件:

g++ -fPIC -shared lib.c -o lib.so

在 lib.so 上运行 nm 后,我发现 testFunction 变成了 _Z12testFunctionv。为什么?我认为在使用 dlsym 加载函数时这是一个大问题。

【问题讨论】:

    标签: c++ c linux shared-libraries


    【解决方案1】:

    您使用 C++ 编译器 g++ 编译了一个 C 程序(并且您的小 C 代码恰好是有效的 C++ 代码)。所以你观察到一些name mangling。您应该改用gcc(它是同一编译器套件GCC....的一部分):

     gcc -Wall -g -O -fPIC -shared lib.c -o lib.so
    

    (我强烈建议使用-Wall 编译以获取所有警告,并使用-g 来获取调试信息;优化标志-O 是可选的-它可以是-O2 以优化更多-和可能会提高生成插件的性能)

    如果您想将 C++ 与 dlopendlsym 一起使用,请务必阅读 C++ dlopen mini-howto

    不要忘记阅读有关 Invoking GCC 的文档

    如果您想避免在真正的 C++ 代码中出现名称混淆,请将您的函数声明为 extern "C"

    【讨论】:

    • 它与 g++ 一起“工作”,它有不同的作用:编译 C++ 代码,而不是 C 代码。碰巧您的 C 代码也是有效的 C++ 代码。如果您使用 new 而不是 testFunction 作为名称,则您的源代码将不是有效的 C++(但在 C 中仍然有效),因为 new 是 C++ 关键字。
    【解决方案2】:

    你需要研究“C++ name mangling”。

    参数类型和更多参数以编译器生成的最终名称进行编码。

    如果您不希望这样(例如,如果您希望函数可以从 C 上下文调用),那么您应该将其设为 extern "C"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2011-06-11
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多