如何链接C++;与gcc共享的库 我看到了一个C++共享库的GCC链接,但是我不能自己复制它。首先,我用一个测试函数创建一个C++库: g++ -shared -o libtest.so test.c

如何链接C++;与gcc共享的库 我看到了一个C++共享库的GCC链接,但是我不能自己复制它。首先,我用一个测试函数创建一个C++库: g++ -shared -o libtest.so test.c,c++,c,linker,shared-libraries,C++,C,Linker,Shared Libraries,然后我有一个testmain函数,它调用库函数并像这样编译它 gcc -o prog.out main.c -L. -ltest 然后我收到了错误 undefined reference to 'testfunc' 我认为这是由于图书馆里不同的参考文献引起的。。。C命名函数TestFUNC和C++来命名函数[一些东西],y.TestFunc(或者可能是一些东西)。 我也尝试过使用 gcc -o prog.out main.c -l:libtest.so 但这会导致同样的错误 因此,我的问题

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

gcc -o prog.out main.c -L. -ltest
然后我收到了错误

undefined reference to 'testfunc'
我认为这是由于图书馆里不同的参考文献引起的。。。C命名函数TestFUNC和C++来命名函数[一些东西],y.TestFunc(或者可能是一些东西)。 我也尝试过使用

gcc -o prog.out main.c -l:libtest.so
但这会导致同样的错误

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

更新:我知道我可以使用
extern“C”
,但这不是解决问题的方法。也许链接器有一些参数

UpDea2:只是认为第一部分可能是用C++编译的,并与GCC链接。我也试过:

g++ -c testlib.c -o testlib.o
gcc -shared -o libtest.so testlib.o
gcc -o prog.out -l:libtest.so

还是不行。标志是否有问题?

是的,问题与共享库无关(我认为…),而与名称损坏有关

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

#ifdef __cplusplus
extern "C" {
#endif

void testfunc(void);

#ifdef __cplusplus
}
#endif

这将导致>TestFunc>代码>对C和C++都有相同的符号和调用约定。


在我现在使用的系统中,C符号名称将是“代码> > TestFunc < /Cord>,C++符号名(假设您不使用<代码>外)C“< /COD>”将是<代码>·y8Z8TestSoviv,它编码有关参数类型的信息,以便重载将正确工作。例如,<代码> ValueTestFUNC(int x)成为y8Z8TestCuffi,它与 > 8Z8TestSoviv不冲突。

< P>当您使用G++时,它编译<强>所有< /强>源为C++。这意味着所有函数都使用C++ ABI(这也包括名称修改)。使用gcc时,它使用c ABI编译*.c文件(无名称混乱)

因此,使用两个不同的编译器编译相同的函数将生成不同的函数(在许多方面)。那是因为它们是不同的语言

要强制g++使用C ABI前缀编译函数,请在其前面加上
extern“C”

或者使用块版本

extern "C" {
<multiple Functions>
}
extern“C”{
}

老实说,我再也不使用gcc编译任何东西了(除非有这样的硬需求(在这种情况下,我通常会修复代码,使其在C++中工作)。如果您使用g++编译所有文件,只会使过程更简单。

如果您确定这不是因为名称混乱。这意味着gcc无法找到库,除非
文件位于标准位置,否则请尝试提供库的完整路径。如果不确定,请重新检查变量(函数)名称是否存在冲突。使用名称空间对类进行分组并定义类内的函数,以避免命名冲突

重复“这不是解决问题的方式”是什么意思?我告诉你,这就是解决问题的方法,除非有什么你没有告诉我们的。@Dietrich Epp看起来就像我在Update2中写的那样。我确信“extern”还没有完成,如果你想看看这个项目:
extern "C" {
<multiple Functions>
}