c++ - 将目标文件的所有符号编译为 Weak

标签 c++ c gcc compiler-construction linker

动机

我有 2 个静态库,libStatic1.alibStatic2.a。此外,我还有许多使用 libStatic1.a 编译的 SO(共享对象)。 至此,libStatic1.a 和 libStatic2.a 是独立的,一切正常。但现在我在生成 libStatic1.a 的代码中添加了对生成 libStatic2.a 的代码的依赖。因此,任何依赖于 libStatic1.a 的 SO 现在都需要使用 libStatic2.a 进行编译。这是不可取的,因为它向依赖于 libStatic1.a 的每个构建目标添加了对 libStatic2.a 的依赖。

只有在 libStatic1.a 上,现在才需要用 libStatic2.a 编译他们的代码,以便编译/运行时成功/不崩溃。这会造成不必要的耦合,我想避免它。

因此,我需要以某种方式将 libStatic2.a 的目标代码“嵌入”到 libStatic1.a 中。如果我只是用 libStatic2.a 的所有目标文件(除了它自己的)编译 libStatic1.a,它基本上会包含它,但这会产生另一个问题 - 如果 libStatic1.a 的某些用户将决定使用 libStatic2.a并链接它,他会得到一个奇怪的“多重定义”错误。如果我能以某种方式告诉编译器生成带有弱符号的 libStatic2.a 的目标文件(仅用于 libStatic1.a),这将解决问题——没有人会得到多个定义,也没有所有许多 SO 的 makefile使用 libStatic1.a 的将需要更改。

我的想法:我知道是possible (使用 GCC/g++ extensions to the C language )使用关键字 __attribute__weak 属性声明一个函数,如下所示: void __attribute__((weak)) foo(int j);

有没有办法告诉编译器 (g++) 将整个编译单元编译为“弱”,这意味着它在符号表中的所有全局符号在链接时都将被视为弱?

或者,是否有办法告诉链接器 (ld) 将某些目标文件/库的所有符号视为弱符号?

最佳答案

如果您的库很小,最简单的方法仍然是通过手动添加 __attribute__((weak)) 来更改声明。

另一种可能是要求 g++ 溢出汇编代码(使用 -S)并有一些(可能是 awked) 脚本对其进行处理。

您还可以编写 GCC 插件(假设您的 g++ 是 4.6 版本)或 GCC MELT的扩展名。

关于c++ - 将目标文件的所有符号编译为 Weak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901926/

相关文章:

c++ - 从三角形网格及其轮廓中提取锐边并使用 openGL 进行渲染

c++ - C++中不同派生类的高效容器

c++ - 如何调整我的功能模板,使它们可以是 "partially specialized"?

计算2的次方,每次打印0

gcc - 哪些 gcc 版本支持 __int128 内在类型?

c++ - 使用脚本在编译时生成代码

c++ - 使用 C++ 解析 Wavefront .obj 文件

c - c 中的二维数组,检查值时出现意外值

c - MPI_Datatype 的动态数组

c++ - 更改类私有(private)数据成员的顺序是否会破坏 ABI