另一个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.a
由cppl.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。有没有办法克服这个问题?
答案 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
有关gcc
和g++
之间行为差异的详情,请参阅https://stackoverflow.com/a/5854712/12711。