【问题标题】:How to combine a C++ object file in a C project compiled with gcc (not g++)?如何在使用 gcc(不是 g++)编译的 C 项目中组合 C++ 目标文件?
【发布时间】:2013-01-28 03:10:39
【问题描述】:

还有一个 C/C++ 集成问题:我正在尝试使用 C++ 库中的功能(我们称之为 libcppl.a)更新一些遗留 C 库(我们称之为 libcl.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++

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

【问题讨论】:

  • 为什么要从命令行中删除libstdc++
  • @DavidRodríguez-dribeas - 因为我已经有了不想更改的构建脚本。
  • 如果更改构建脚本的成本很高,那么您的主要问题不是问题,而是如何修复构建系统。除其他外,编程是适应不断变化的环境,这应该是构建脚本中的简单更改。解决根本问题,症状就会消失。
  • @DavidRodríguez-dribeas - 是的,可能就是这么贵。依赖该库的不仅仅是我的脚本,还有其他人。在强制公众使用 C++ 编译器之前,我更愿意尝试将新功能移植到 C 中。否则,你是对的,迈克尔也是。

标签: c++ c gcc g++


【解决方案1】:

可以单独编译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

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

g++ -x c prog.c -lcl

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

【讨论】:

  • 谢谢,但正如我在问题中所写,我想使用 GCC 而不是 G++ 来构建项目。
  • @ysap: 嗯——我没看到,只是想避免明确地喊出libstdc++。即便如此,我认为最好使用g++ 或明确链接libstdc++,而不是尝试像将libstdc++ 放入另一个存档(即使你可以让它工作)这样的黑客攻击。我认为在路上维护构建的人不会非常欣赏这种奇怪的东西。
  • +1,同意 Michael 的观点,将 C 集成到 C++ 项目中比其他方式更容易。最简单的就是切换到C++,然后用C编译器编译特定部分(即使是90%的代码)。
  • Michael,@DavidRodríguez-dribeas,一般来说,你是对的,我会这样做。但是,我想保留“纯 C 环境”是有原因的。不幸的是,这个答案和 cmets 没有回答我的 3 个问题中的任何一个。
  • @ysap:希望其他人能够回答您的问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多