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

ysa*_*sap 6 c c++ gcc g++

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

>> gcc prog.c -lcl
Run Code Online (Sandbox Code Playgroud)

libcl.a目前包括的cl.o对象文件(具有创建gcccl.c+ cl.h).

libcppl.a由的cppl.o对象文件(具有创建g++cppl.cpp+ cppl.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++
Run Code Online (Sandbox Code Playgroud)

但是,我想消除 libstdc++ 在编译命令行中明确提到的内容.

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

>> ar rcs libcl.a cl.o cppl.o /usr/lib/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

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

>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mic*_*urr 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
Run Code Online (Sandbox Code Playgroud)

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

g++ -x c prog.c -lcl
Run Code Online (Sandbox Code Playgroud)

有关和之间行为差异的更多信息,请参阅/sf/answers/409829871/.gccg++