将静态库与静态库链接
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 有一个工具可以做到这一点。不过要小心冲突的名称或符号。以上是关于将静态库与静态库链接的主要内容,如果未能解决你的问题,请参考以下文章