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