CMake 与其他静态库一起构建静态库

CMake building a static library with other static library

我的问题如下:

我有 OpenSSL 作为静态库(libcrypto.alibssl.a)。 使用 MSys2/MinGW64 在 Windows 上编译。 除此之外,我还有一个基于 OpenSSL.

的小型自写库

现在我想 "bundle" Crypto libOpenSSL 和我的库到 "big" 静态库,以便稍后在 [=42= 上的其他应用程序中静态编译] 没有部署任何库。

CMakeLists.txt 文件是什么样的?前提条件(OpenSSL as static libs)是否正确?

实际上将其编译为动态 DLL 就像一个魅力。但是我的静态库只包括我自己的库的符号,而不是来自OpenSSL

实际上我没有可用的 CMake 文件,所以我无法提供示例。我只是在寻找如何去做的方向。

如能提供有关如何开始的简短建议,我们将不胜感激。

target_link_library() works both for add_executable() and add_library(),所以你应该可以做到:

add_library(yourlib STATIC ...)
target_link_libraries(yourlib lib1 lib2 ...)

(其中 yourlib 是您的库,lib1,...是您要捆绑的库。

如果您真正想做的是将多个静态库合并为一个,为了方便外部消费者,您可能需要 运行 自定义命令来执行此操作(因为它不是经常这样做)。

使用 GNU 工具链,执行此操作的命令可能如下所示(虽然未经测试):

${CMAKE_COMMAND} -E make_directory tempdir
cd tempdir
${CMAKE_AR} x $<yourlib:TARGET_FILE>
${CMAKE_AR} x ${OPENSSL_CRYPTO_LIBRARY}
${CMAKE_AR} x ${OPENSSL_SSL_LIBRARY}
${CMAKE_AR} cf ${CMAKE_BINARY_DIR}/bin/libyourmegalib.a *.o
cd ..
${CMAKE_COMMAND} -E remove_directory tempdir

然后您将使用 add_custom_command() 创建目标 运行 此脚本 - 将这些行作为 COMMAND 参数,或创建脚本模板,在 CMake 生成时替换值时间使用 configure_file(),然后使用自定义命令 运行 该脚本。

就是说,如果外部消费者自己都在使用 CMake,我会完全跳过这一步,让您的库的安装过程生成声明对 OpenSSL 库的依赖项的 CMake 包配置文件。