将静态库与静态库链接

Posted

技术标签:

【中文标题】将静态库与静态库链接【英文标题】:Link static library with static library 【发布时间】:2015-06-03 13:43:13 【问题描述】:

我有一个Makefile.am 和两个noinst_LIBRARIES,其中一个需要与另一个链接。

将其添加到 CFLAGS 会引发编译器警告,但据我所知,automake 喜欢将 LDADD 与库一起使用,因为它们不是完整的程序。

假设libb.a 需要拉入liba.a,我该怎么做?

【问题讨论】:

你不链接静态库,它们被添加到你的二进制文件中。 我不清楚您到底想做什么,但请注意,您不能将一个静态库链接到另一个。它们只是目标文件的集合,静态库中没有机制表明它们依赖于另一个库。 @nos true,但是如果存在依赖关系,即如果 liba.a 使用来自 libb.a 的符号,那么在二进制文件中包含库时,您必须注意传递它们的顺序。这意味着循环依赖是不允许的 Possible Duplicate @iharob 可以处理循环依赖,但是在链接使用它们的程序时必须多次提及这些库,例如传递标志-lA -lB -lA 【参考方案1】:

你做不到。实际上,您尝试做的事情并没有真正的意义。静态库只是包含目标文件和目录的档案。简而言之,您可以将静态库视为包含 .o 文件的 .zip

链接阶段仅在编译共享对象或可执行文件时发生。当您的程序链接到liba.a 时,您还需要指定-static -lb 或类似名称。

【讨论】:

我想我正在考虑将静态库“链接”为“在最后一个库中包含来自另一个库的目标文件”。 这与链接相去甚远 :) 如果您的意思是将两个档案合并到另一个档案中,则没有通用的方法(因为静态库不应该那样处理),但您可能会发现特定于平台的方式。例如,GCC/Clang 静态库是 ar 档案,您可以提取、合并和重新打包。相反,MSVC 有一个工具可以做到这一点。不过要小心冲突的名称或符号。

以上是关于将静态库与静态库链接的主要内容,如果未能解决你的问题,请参考以下文章

将 C 库与 Haskell 库静态链接

Linux动态库与静态库

Linux动态库与静态库

静态库与动态库注入

在 Windows 中将 VS2005 静态库与 gcc 链接

如何使用cmake生成基于静态库的动态链接库