如何将C++共享库与 gcc 链接
How to link a C++ shared library with gcc
我看到了一个带有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++将函数命名为 [一些东西]__testfunc[也许又是一些东西]。
我也尝试使用
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
仍然不起作用。旗帜有问题吗?
是的,这个问题与共享库无关(我认为......),而与名称重整有关。
在标头中,必须像这样声明函数:
#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++ 时,它会将所有源代码编译为C++。这意味着所有函数都使用 ABI C++(这也包括名称重整)。当你使用gcc时,它使用C ABI(无名称重整)编译*.c文件。
因此,使用两个不同的编译器编译的同一函数将生成不同的函数(在很多方面)。那是因为它们是不同的语言。
强制 g++ 使用 C ABI 编译函数,并在其前面加上 extern "C"
extern "C" void testfunc(char*);
或者使用块版本
extern "C" {
<multiple Functions>
}
老实说,我再也不会用 gcc 编译任何东西了(除非有一些硬性要求(在这种情况下,我通常会修复代码,使其在 C++ 中工作))。如果你用g++编译所有文件只会让过程更简单。
如果你确定这不是因为名字混乱。然后这意味着 gcc 找不到库尝试提供库的完整路径,除非.so
文件位于标准位置。如果不确定,请重新检查变量(函数)名称中是否存在任何冲突。使用命名空间对类进行分组并定义类中的函数以避免命名冲突
- 未知的 GCC 链接器错误,但已成功构建
- 微控制器的首次 gcc 链接器脚本编译但不运行
- 简单派生类上的Linux GCC链接错误
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- GCC链接器 - 将存档中的所有对象文件映射到特定部分
- 在Mac 10.9 Mavericks上,clang配置与gcc链接配置不同吗
- 使用GCC链接库中的Ubuntu中的C 代码
- GCC链接器:使用了哪些输入库
- 如何将GCC链接器固定地址添加到链接文件中
- 源代码生成的gcc链接错误
- fedora上的gcc链接器错误:未定义的引用
- GCC链接器抱怨对现有全局变量的未定义引用
- 编译静态库时出现 GCC 链接器错误
- 为什么gcc链接器对.a文件和.o文件的行为不同
- gcc链接的默认库
- 如何将C++共享库与 gcc 链接
- x86_64-pc-cygwin-gcc 链接器错误
- GCC 链接错误"__wcsrtombs: Zusicherung »data.__outbuf[-1] == '