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

标签 c++ linux cmake static-linking

我需要提供一个带有静态库的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/

相关文章:

C++生成随机数

php - linux - 应该是 php/modules 下的 pdo_mysql.so 文件?我只有 pdo.so 和 pdo_sqlite

无法在 VS 2019 上以 Release模式为 SDL 库构建解决方案

c++ - 如何快速比较 C++ 中的可变长度位串?

c++ - 流上的 >> 运算符如何返回对自身的引用

c++ - 在 C++ 中拆分和合并 std::list

c++ - 固定限制的循环更快

linux - 我的 32 位 ubuntu 使用 16g 内存怎么样

c++ - 使用 CMake 在项目中链接 curl

linux - `Cmake` 在调用 `target_link_libraries(target_name, library_name_without_postfix)` 时更喜欢链接到哪个库?