如何将C++共享库与gcc链接

mar*_*que 4 c c++ linker shared-libraries

我看过一个带有C++共享库的GCC链接,但我无法自己重现它.首先,我创建一个带有testfunction的C++库:

g++ -shared -o libtest.so test.c
Run Code Online (Sandbox Code Playgroud)

然后我有一个测试main函数,它调用库函数并像这样编译它

gcc -o prog.out main.c -L. -ltest
Run Code Online (Sandbox Code Playgroud)

然后我收到错误

undefined reference to 'testfunc'
Run Code Online (Sandbox Code Playgroud)

我认为这是由库中的不同引用引起的... C命名函数testfunc和C++命名函数[some stuff] __ testfunc [也许再一些东西].

我也试过用

gcc -o prog.out main.c -l:libtest.so
Run Code Online (Sandbox Code Playgroud)

但这会导致同样的错误.

因此,我的问题是:如何将c ++库与gcc链接到ac文件?

更新:我知道我可以使用extern "C",但这不是它的解决方式.也许链接器有一些参数呢?

Update2:只是认为第一部分可能只是用c ++编译并与gcc链接.还试过这个:

g++ -c testlib.c -o testlib.o
gcc -shared -o libtest.so testlib.o
gcc -o prog.out -l:libtest.so
Run Code Online (Sandbox Code Playgroud)

仍然无法正常工作.旗帜有问题吗?

Die*_*Epp 8

是的,问题与共享库(我认为......)无关,而且与名称修改有关.

在标题中,您必须声明如下函数:

#ifdef __cplusplus
extern "C" {
#endif

void testfunc(void);

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

这将导致testfuncC和C++具有相同的符号和调用约定.

在我正在使用的系统上,C符号名称将是_testfunc和C++符号名称(假设您使用extern "C")将__Z8testfuncv编码有关参数类型的信息,因此重载将正常工作.例如,void testfunc(int x)变为__Z8testfunci,不会与之发生冲突__Z8testfuncv.