我正在尝试制作最简单的库。
#include <stdio.h>
void PutLoLoLo(){
puts("Lololo");
}
用g ++编译:
g++ -shared -fPIC main2.cpp -o simple.so -Wall
我在符号表中得到了这个:
:$ nm -D --dynamic --defined-only simple.so
0000048c T _Z9PutLoLoLov
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init
但我期待这样的事情:
0000048c T PutLoLoLo
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init
因此,当我尝试加载它时,我得到了dlopen()错误。
请帮助我:我做错了什么?
答案 0 :(得分:4)
C ++ mangles符号名称。如果要避免重复,则必须将函数声明为extern C
,如下所示:
#include <stdio.h>
extern "C" void PutLoLoLo(){
puts("Lololo");
}
然后链接:
$ g++ -shared -fPIC lolo.cc -o lolo.so -Wall
会给你你期望的东西:
$ nm -D --dynamic --defined-only ./lolo.so
000000000000061c T PutLoLoLo
0000000000002018 A __bss_start
0000000000002018 A _edata
0000000000002028 A _end
0000000000000668 T _fini
0000000000000500 T _init
您可以通过其“普通”名称来删除库并获取符号。该函数仅限于具有C语义。例如,您不能使用成员函数执行此操作,或者使用具有类语义作为参数的对象等。因此,如果您需要传入对象,则需要将这些参数作为void *
,并且铸造。
答案 1 :(得分:3)
看起来像C ++名称错误。试试这个:
extern "C" void PutLoLoLo(){
puts("Lololo");
}