我可以让 gcc 链接器创建一个静态库吗?
Posted
技术标签:
【中文标题】我可以让 gcc 链接器创建一个静态库吗?【英文标题】:Can I have the gcc linker create a static library? 【发布时间】:2010-12-24 23:04:50 【问题描述】:我有一个包含大约 300 个 c++ 文件的库。
使用该库的程序不想动态链接到它。 (各种原因,但最好的是部分支持的平台不支持动态链接)
然后我使用 g++ 和 ar 创建一个静态库 (.a),该文件包含所有这些文件的所有符号,包括库不想导出的符号。
我怀疑将消费程序与此库链接会花费不必要的长时间,因为 .a 中的所有 .o 文件仍需要解析其引用,并且链接器有更多符号要处理。
在创建动态库 (.dylib / .so) 时,您实际上可以使用链接器,它可以解析所有库内符号,并仅导出库想要导出的那些。然而,结果只能在运行时“链接”到消费程序中。
我想以某种方式获得动态链接的好处,但使用静态库。
如果我的谷歌搜索正确地认为这确实是不可能的,我很想了解为什么这是不可能的,因为这似乎是许多 c 和 c++ 程序可以从中受益的东西。
【问题讨论】:
【参考方案1】:静态库只是档案(因此是“.a”),是 .o 文件的集合。就像一个 tar 档案,只是更简单。由于 ar 不是链接器,因此没有聚合(就像“ld -r”那样),因此没有库内符号消除。
这就是最初发明共享库的原因,而且它们现在非常普遍,所以人们只是忽略了静态库的缺点。他们只是通过“它编译?发布它。”。
【讨论】:
【参考方案2】:我没有尝试或测试过这一点,但看起来ld
执行增量或部分链接的能力可能正是您想要的。检查 --relocatable
选项(如果处理 C++,您可能还需要查看 -Ur
选项)应用于将进入库的目标文件时是否会执行您想要的操作。
我认为您应该能够将该操作的输出用作目标文件(或将其保存在静态库本身中)用于程序的最终链接步骤。
【讨论】:
如果这确实是可能的,你知道为什么不是地球上的每个人都这样做吗?我不可能是第一个想到这个的人以上是关于我可以让 gcc 链接器创建一个静态库吗?的主要内容,如果未能解决你的问题,请参考以下文章