我可以让 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 链接器创建一个静态库吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以静态链接动态 C 库吗?

gcc 链接器库搜索顺序;路径加静态与共享

让 GCC 链接器警告多个函数定义

gcc 使用的实际默认链接描述文件和设置

链接过程

为啥链接器链接了错误的函数?