我有2个静态库, libStatic1.a 和 libStatic2.a 。另外,我有许多使用libStatic1.a编译的SO(共享对象)。 到目前为止,libStatic1.a和libStatic2.a是独立的,一切都很好。但是现在我添加了生成libStatic1.a的代码,它依赖于生成libStatic2.a的代码。因此,任何依赖于libStatic1.a的SO现在都需要使用libStatic2.a进行编译。这是不可取的,因为它将libStatic2.a的依赖性添加到依赖于libStatic1.a的每个构建目标。
仅在libStatic1.a上现在需要使用libStatic2.a编译它们的代码,以便编译/运行时成功/不崩溃。这造成了不必要的耦合,我想避免它。
因此,我需要在libStatic1.a中以某种方式“嵌入”libStatic2.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 __ 和 弱>的函数em> 属性如下:
void __attribute__((weak)) foo(int j);
有没有办法告诉编译器(g ++)将整个编译单元编译为“弱”,这意味着在链接时,符号表中的所有全局符号都会被视为弱?
或者,是否有办法告诉链接器(ld)将某些对象文件/库的符号视为 all ,就好像它们很弱?
答案 0 :(得分:1)
如果您的图书馆很小,最简单的方法仍然是通过手动添加__attribute__((weak))
来更改声明。
另一种可能性是让g++
泄漏汇编代码(使用-S
)并在其上运行一些(可能是awk
或ed
)脚本。< / p>
您也可以编写GCC插件(假设您的g ++是4.6版本)或GCC MELT扩展名。
答案 1 :(得分:1)
正常编译,然后使用objcopy
--weaken
对象文件进行编译。
答案 2 :(得分:0)
不,似乎没有;有那么多弱外部函数,单独设置它们的属性是不切实际的吗?