gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:00 25 4
gpt4 key购买 nike

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

这里是我的配置:

  • 为我所有的 10 个依赖库创建 cmake。为我的每个模块生成一个静态库 (.a)。这些库仅包含给定模块的目标文件 .o。依赖树不是扁平的,其中一些依赖于其他。
  • 一个简单的示例“example.cpp”,带有 cmake,可以编译并运行。在这一层,cmakes 生成一个非常复杂的链接命令来处理 deps 树。
  • 外部依赖,例如 boost(还有一些静态库)

目前,我试过这个:

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

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

顺便说一句,另一个有趣的话题: Combining static libraries

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

最佳答案

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

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

关于c++ - 带有 cmake 的独立静态库 (.a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5855718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com