gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:05 25 4
gpt4 key购买 nike

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

>> gcc prog.c -lcl

libcl.a目前包括 cl.o目标文件(使用 gcccl.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++ 在编译命令行中

我试图做的是通过执行以下操作将 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++prog.c 编译为 C 源代码,一步编译和链接 prog.c使用 -x 选项的文件:

g++ -x c prog.c -lcl

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

关于c++ - 如何在用 gcc(不是 g++)编译的 C 项目中组合 C++ 目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14554926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com