8

另一个 C/C++ 集成问题:我正在尝试libcl.a使用 C++ 库中的功能(我们称之为)更新一些遗留的 C 库(我们称之为libcppl.a)。该liblc.a库在我的环境中被广泛使用,并使用 GCC(在 C 编译器模式下)链接到许多 C 项目中:

>> gcc prog.c -lcl

当前libcl.acl.o目标文件组成(使用gccfrom cl.c+创建cl.h)。

由目标文件(使用from +创建)libcppl.a组成。cppl.og++cppl.cppcppl.h

因为现有的应用程序是用 C 编写的,并且构建脚本使用的是 GCC,所以我希望尽可能简单地过渡到更新的库。因此,我想继续使用 GCC 作为主编译器,但仍然能够链接到更新的库。

找到这个答案,我可以使用以下方法将 C++ 对象链接到 GCC C 项目-lstdc++

>> gcc -c cl.c   -o cl.o
>> g++ -c cppl.c -o cppl.o
>> ar rcs libcl.a cl.o cppl.o
>> gcc prog.c -lcl -lstdc++

但是,我想消除 libstdc++ 在编译命令行中明确提及的。

我试图做的是在 cl 库中包含 libstdc++,方法是:

>> ar rcs libcl.a cl.o cppl.o /usr/lib/libstdc++.so.6

但是,在构建应用程序时,我得到:

>> gcc prog.c -lcl
In file included from cppl.cpp:2:
./libcl.a(cppl.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

1. 为什么 gcc 链接器找不到与我的对象一起归档的 C++ 标准库?

2. 使用库(相对于目标文件)是否有限制?ar

3.有没有办法克服这个问题?

4

1 回答 1

7

prog.c您可以使用单独编译gcc,然后使用g++链接:

# compile the main program to an object file
gcc  prog.c -o prog.o

#use g++ to link everything (it'll automatically pull in libstdc++)
g++ prog.o -lcl

或者,您可以通过使用以下选项明确告诉编译为 C 源文件,prog.c一步编译和链接:g++prog.c-x

g++ -x c prog.c -lcl

有关和之间行为差异的更多信息,请参阅https://stackoverflow.com/a/5854712/12711gccg++

于 2013-01-28T03:21:09.400 回答