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 加载函数时这是一个大问题。
您使用 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".