如何在用gcc(而不是g ++)编译的C项目中组合C ++目标文件?

时间:2013-01-28 03:10:39

标签: c++ c gcc g++

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

>> gcc prog.c -lcl

libcl.a目前包含cl.o目标文件(使用gcc + cl.c中的cl.h创建。

libcppl.acppl.o目标文件(使用g++ + cppl.cpp中的cppl.h创建)组成。

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

查找this answer,我可以使用-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++

我尝试做的是在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。有没有办法克服这个问题?

1 个答案:

答案 0 :(得分:5)

您可以使用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

或者,您可以使用prog.c选项明确告知g++prog.c编译为C源文件,从而在一个步骤中编译和链接-x

g++ -x c prog.c -lcl

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