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)
仍然无法正常工作.旗帜有问题吗?
是的,问题与共享库(我认为......)无关,而且与名称修改有关.
在标题中,您必须声明如下函数:
#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.