0. 代码
c
// c
int add(int a, int b) {
return a + b;
}
用gcc编译成动态库,并用nm看函数名字。
bash
gcc -shared -fPIC -o libtest.so add.c
nm -D --defined-only ./libtest.so | grep -E "[Tt]"
0000000000201020 B __bss_start
0000000000201020 D _edata
000000000000056c T _fini
0000000000000460 T _init
0000000000000555 T add
用g++编译成动态库,并用nm看函数名字
bash
g++ -shared -fPIC -o libtestc++.so add.c
nm -D --defined-only ./libtestc++.so | grep -E "[Tt]"
0000000000000555 T _Z3addii
0000000000201020 B __bss_start
0000000000201020 D _edata
000000000000056c T _fini
0000000000000468 T _init
如果要g++编译动态的名字不变,需要加上以下代码
c
// add.h
#ifdef __cplusplus
extern "C" {
int add(int a, int b);
}
#endif
// add.c
#include "add.h"
int add(int a, int b) {
return a + b;
}
1. 原因
这个是 C++ 的名字修饰(Name Mangling) 机制导致的,是 C++ 为了支持函数重载、命名空间、类成员函数等特性,而对函数名进行的特殊编码,最终会在编译后的 SO(共享库)中生成带有额外字符的函数名。