如何在使用 gcc(不是 g++)编译的 C 项目中组合C++对象文件

How to combine a C++ object file in a C project compiled with gcc (not g++)?

本文关键字:项目 组合 文件 对象 C++ 编译 gcc g++ 不是      更新时间:2023-10-16

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

>> gcc prog.c -lcl

libcl.a当前由cl.o对象文件(使用 cl.c + cl.h 中的gcc创建)。

libcppl.acppl.o对象文件(使用 cppl.cpp + cppl.h 中的g++创建)。

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

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

>> 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++的明确提及

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

>> 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. 有没有办法克服这个问题?

您可以使用

gcc单独编译prog.c,然后使用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

或者,您可以通过显式告诉g++使用 -x 选项将prog.c编译为 C 源文件,一步到位编译和链接prog.c

g++ -x c prog.c -lcl

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