为什么编译共享库后函数名称会改变?

Tav*_*avy 1 c c++ linux shared-libraries

lib.c 包含:

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

我用这个命令编译文件:

g++ -fPIC -shared lib.c -o lib.so
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 5

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

 gcc -Wall -g -O -fPIC -shared lib.c -o lib.so
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果您想避免在真正的 C++ 代码中进行名称修改,请将您的函数声明为extern "C".