gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:24 26 4
gpt4 key购买 nike

我看到了一个带有 C++ 共享库的 GCC 链接,但我无法自己复制它。所以首先我创建了一个带有测试函数的 C++ 库:

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

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

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

然后我收到错误

undefined reference to 'testfunc'

我认为这是由库中的不同引用引起的...C 将函数命名为 testfunc,而 C++ 将函数命名为 [some stuff]__testfunc[maybe again some stuff]。

我也试过用

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

但这会导致同样的错误。

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

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

更新 2:只是认为第一部分也可能只是用 c++ 编译并与 gcc 链接。也试过这个:

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

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

最佳答案

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

在您的 header 中,您必须像这样声明函数:

#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 发生冲突。

关于c++ - 如何将 C++ 共享库与 gcc 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11184473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com