为什么编译共享库后函数的名称会发生变化?
Why function's names change after compiling a shared library?
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++编译器g++
编译了一个C程序(您的小C代码恰好是有效的C++代码)。所以你会发现一些名字被篡改了。您应该使用gcc
(它是同一编译器套件GCC的一部分…):
gcc -Wall -g -O -fPIC -shared lib.c -o lib.so
(我强烈建议使用-Wall
进行编译以获得所有警告,使用-g
进行编译以获取调试信息;优化标志-O
是可选的-可以使用-O2
进行更多优化-并可能提高生成的插件的性能)
如果您想将C++与dlopen
&dlsym
一定要阅读C++dlopen迷你操作指南。
不要忘记阅读有关调用GCC 的文档
如果您想避免在真正的C++代码中篡改名称,请将函数声明为extern "C"
。
您需要研究"C++名称篡改"。
参数类型及更多类型编码在编译器生成的最终名称中。
如果您不希望这样(例如,如果您希望函数可以从C
上下文中调用),那么您应该将其设置为extern "C"
。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 为什么编译共享库后函数的名称会发生变化?