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

standalone static library (.a) with cmake

本文关键字:静态 cmake 独立 带有      更新时间:2023-10-16

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

这里是我的配置:

  • cmake用于我所有的10个依赖关系库。有一个为我的每个模块生成的静态库(.a(。这些库只包含给定模块的对象文件.o。依赖树不是平坦的,其中一些依赖于其他依赖
  • 一个简单的示例"example.cpp",带有cmake,它可以编译并工作。在这个级别上,cmakes生成了一个非常复杂的链接命令来处理deps树
  • 外部依赖项,如boost(也有一些静态库(

目前,我尝试了这个:

  • 制作一个不同的.a的存档,但它不起作用,因为链接到这个库告诉我存档没有索引(即使在ranlib之后(。然而,我记得我可以毫无问题地在.a文件中添加.a库
  • 从所有*.a文件中提取所有.o对象(使用ar-x(文件,并用所有这些对象文件重新创建一个"libsdk.a"。它也不起作用(未解析的引用(。此外,它包括所有对象,甚至是那些不需要的对象。。。我的工作例子是370万。这个图书馆大约有3500万
  • 创建.so共享库。它似乎有效,但我更喜欢一个静态库
  • 静态编译所有内容,但链接器抱怨找不到-lgccs。好吧,我想用静态编译,但不是那么远,只是我自己的libs在一起

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

顺便说一句,另一个有趣的话题是:组合静态库

谢谢你给我的任何建议,让我敞开心扉!

您尝试手动执行的是链接器的工作。虽然它是可行的,但你不应该为此而烦恼。

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

请参阅CMake邮件列表上的这篇文章。附加到消息的libutils.cmake具有执行此操作的MERGE_STATIC_LIBS((宏。在Linux(以及除OSX之外的所有其他Unix(上,它使用ar来打包和解包对象文件。