如何链接一个C++共享库与海湾合作委员会

问题描述:

我看到一个GCC链接与C++共享库,但我无法自己重现它。因此,首先创建一个C++库与testfunction:如何链接一个C++共享库与海湾合作委员会

g++ -shared -o libtest.so test.c 

然后我有一个调用库函数的测试主要功能和编译这样

gcc -o prog.out main.c -L. -ltest 

然后我收到错误

undefined reference to 'testfunc' 

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

我也曾尝试使用

gcc -o prog.out main.c -l:libtest.so 

但这会导致同样的错误。

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

更新:我知道我可以使用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 

仍然不起作用。旗帜有问题吗?

+1

duplicate http://stackoverflow.com/questions/1068129/c-library-not-linking-using-gcc-g –

+2

你是什么意思“这不是它被解决的方式”?我告诉你,除非你没有告诉我们,否则**就是它被解决的方式。 –

+0

@Dietrich Epp看起来就像我在Update2中写的一样。我确信它没有用'extern'完成 - 如果你想看看这个项目:[openjdk](http://openjdk.java.net/) –

是的,这个问题与共享库(我认为...)无关,而且与名称混编有关。

在你的头,你必须声明函数是这样的:

#ifdef __cplusplus 
extern "C" { 
#endif 

void testfunc(void); 

#ifdef __cplusplus 
} 
#endif 

这将导致testfunc具有相同的符号,并且对于C和C++调用约定。

在我现在使用的系统中,C符号的名字将是_testfunc和C++符号名(假设你使用extern "C")将__Z8testfuncv,编码有关的参数类型等等信息超载将正常工作。例如,void testfunc(int x)变成__Z8testfunci,其不与__Z8testfuncv相冲突。

当你使用g ++时,它编译ALL源代码为C++。这意味着所有函数都使用C++ ABI(这也包括名称修改)。当你使用gcc时,它使用C ABI(无名称修饰)编译* .c文件。

因此,与两种不同的编译器编译相同的函数会产生不同的函数(以很多方式)。这是因为他们是不同的语言

为动力G ++编译使用C ABI前缀它的功能与extern "C"

extern "C" void testfunc(char*); 

另外也可以使用块版本

extern "C" { 
<multiple Functions> 
} 

说实话,我从来没有编译用gcc什么了(除非有一些困难的要求(在这种情况下,我通常修复代码,所以它在C++中工作))。如果使用g ++编译所有文件,只是简化了这些过程。

如果您确定这不是因为名称损坏。然后这意味着gcc无法找到库,除非.so文件处于标准位置,否则请尝试给出库的完整路径。如果您不确定,请重新检查变量(函数)名称中的任何冲突。使用命名空间来分组类并定义类中的函数以避免命名冲突