我有一个包含大约300个c ++文件的库。
使用库的程序不希望动态链接到它。 (出于各种原因,但最好的一点是某些受支持的平台不支持动态链接)
然后我用g ++和ar创建一个静态库(.a),这个文件包含所有这些文件的所有符号,包括库不想导出的文件。
我怀疑将耗材程序与此库链接需要花费不必要的长时间,因为.a中的所有.o文件仍需要解析其引用,并且链接器有更多要处理的符号。
创建动态库(.dylib / .so)时,您实际上可以使用链接器,该链接器可以解析所有lib内符号,并仅导出库要导出的符号。但结果只能在运行时“链接”到消耗程序中。
我想以某种方式获得动态链接的好处,但使用静态库。
如果我的谷歌搜索是正确的,认为这确实是不可能的,我很想理解为什么这是不可能的,因为它似乎是很多c和c ++程序可以从中受益的。
答案 0 :(得分:4)
静态库只是档案(因此是“.a”),是.o文件的集合。就像tar档案一样,更为简单。由于ar不是链接器,因此没有聚合(如“ld -r”所做),因此没有内部符号消除。
这就是为什么共享库首先发明的原因,现在它们非常普遍,所以人们只是忽略了静态库的缺点。他们只是简单地说“它编译它?”。
答案 1 :(得分:1)
我没有尝试或测试过这个,但看起来ld
执行增量或部分链接的能力可能正是您所寻找的。检查是否--relocatable
选项(如果处理C ++,您可能还需要查看-Ur
选项),当应用于将进入库的目标文件时,将执行您想要的操作。
我认为您应该能够将该操作的输出用作目标文件(或将其放在静态库本身中),以用于程序的最终链接步骤。