带有cmake的独立静态库(.a)

时间:2011-05-02 09:52:16

标签: c++ linux cmake static-linking

我需要提供一个带有静态库的SDK。我们称之为“libsdk.a”。 这个库应该是独立的,这意味着一个简单的例子“example.cpp”可以链接它而不需要任何其他库,除了系统库。

这是我的配置:

  • cmake我所有的10个依赖库。为我的每个模块生成了一个静态库(.a)。这些库仅包含给定模块的目标文件.o。依赖树不平坦,其中一些依赖于其他树。
  • 一个简单的例子“example.cpp”,带有一个编译和工作的cmake。在这个级别,cmakes生成一个非常复杂的链接命令来处理deps树。
  • 外部依赖项,例如boost(某些静态库)

目前,我试过这个:

  • 生成不同的.a生成的存档,但它不起作用,因为链接此lib告诉我存档没有索引(即使在ranlib之后)。然而,我记得我可以在.a文件中添加.a库而不会出现问题。
  • 从所有* .a文件中提取所有.o对象(带有ar -x)文件,并使用所有这些对象文件重新创建“libsdk.a”。它也不起作用(未解析的引用)。此外,它包括所有对象,甚至包括那些不需要的对象......我的工作示例需要3.7M。这个图书馆大约35M。
  • 制作一个.so共享库。它似乎工作,但我更喜欢有一个静态库。
  • 静态编译,然后链接器抱怨它找不到-lgcc_s。好的我想在静态编译,但不是那么远,只是我自己的库一起编译!

所以我的最后一个问题是:有什么方法可以生成包含我所有其他库的静态库,而不是系统库?

BTW,另一个有趣的话题: Combining static libraries

感谢您提出任何建议让我敞开心扉!

2 个答案:

答案 0 :(得分:1)

您要手动完成的工作是链接器的工作。虽然它是可行的,但你不应该为此烦恼。

编译libsdk.a时,请确保其所有依赖项都是静态链接的。如果您这样做,libsdk.a应该是独立的。静态链接意味着将代码复制到最终可执行文件中的正确位置,因此静态链接的任何内容都不需要在外部文件中提供。

答案 1 :(得分:0)

this post on CMake mailing list。附加到消息的libutils.cmake具有执行该作业的MERGE_STATIC_LIBS()宏。在Linux(以及除OSX之外的所有其他Unix)上,它使用ar来打包和解压缩对象文件。