动机
我有两个静态库,libStatic1.a和libStatic2.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(,这将解决问题——没有人会得到多个定义,也没有使用libStatic1-a的所有SO的makefile需要更改。
我的想法:我知道(使用C语言的GCC/g++扩展(可以用关键字__attribute__和weak属性声明一个函数,如下所示:void __attribute__((weak)) foo(int j);
有没有一种方法可以告诉编译器(g++(将整个编译单元编译为"弱",这意味着符号表中的所有全局符号在链接时都将被视为弱?
或者,是否有方法告诉链接器(ld(将某些对象文件/库的所有符号视为弱符号
如果您的库很小,最简单的方法仍然是通过手动添加__attribute__((weak))
来更改声明。
另一种可能性可能是要求g++
溢出程序集代码(使用-S
(,并让一些(可能是awk
或ed
(脚本处理它
您还可以为其编写GCC插件(假设您的g++是4.6版本(或GCC MELT扩展。
正常编译,然后用--weaken
objcopy
对象文件。
不,似乎没有;是否存在如此多的弱外部函数,以至于单独设置它们的属性是不可行的?