带有cmake的独立静态库(.a)
standalone static library (.a) with cmake
我需要提供一个带有静态库的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来打包和解包对象文件。
相关文章:
- cmake如何在fedora工作站中找到boost静态库包
- cmake在我的项目中所需的所有静态库都不成功
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将源中的 GLEW 与 cmake 静态链接
- 在 CMAKE 中使用具有静态依赖项的库
- 在现代 CMake 项目中存档静态依赖项
- 使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?
- Linux Mint 19 上的 CMake 3.11 无法找到静态的 Boost 库
- 强制链接静态库与 cmake 不起作用
- 静态链接到 CMake 中的 macOS 框架
- 如何使用 CMake 生成链接到静态库的 DLL
- CMake 外部和内部静态库的循环依赖关系
- CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)
- 使用CMAKE构建和安装静态库
- 如何使用cmake设置OpenCV以启用动态和静态构建
- Cmake 查找模块用于区分共享库或静态库
- 当我链接动态库而不是静态库时,CMake 有效
- CMake 项目链接静态库
- 使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL
- 如何将 SDL2 用作我的静态 (CMake ) 库的 3D 方依赖项?