CMake 使用其他静态库构建静态库

Posted

技术标签:

【中文标题】CMake 使用其他静态库构建静态库【英文标题】:CMake building a static library with other static library 【发布时间】:2018-04-20 15:31:23 【问题描述】:

我的问题如下:

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

现在我想将 Crypto libOpenSSL 与我的库“捆绑”到一个“大”静态库,以便以后在 Windows 上的其他应用程序中静态编译而无需部署任何库。

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

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

实际上我没有可用的CMake 文件,所以我不能包含示例。我只是在寻找如何去做的方向。

我们将非常感谢您提供一个简短的建议。

【问题讨论】:

简而言之,CMake doesn't help 你将几个静态库合并为一个。您可以使用 add_custom_command/add_custom_target 来指定实用程序调用,它可以完成这项工作。 CMake-不相关 方式在该问题中看到:***.com/questions/3821916/…。 【参考方案1】:

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

使用 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,我会完全跳过这一步,只需让您的库的安装过程生成 CMake 包配置文件,以声明对 OpenSSL 库的依赖关系。

【讨论】:

非常感谢,现在 CMake 变得更加清晰了。这正是我所需要的。【参考方案2】:

target_link_library() 适用于 add_executable() 和 add_library(),因此您应该可以这样做:

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

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

【讨论】:

target_link_libraries 不会将其他库捆绑到您的库中。所以,当创建一个使用yourlib的应用程序时,它仍然需要存在lib1lib2库。

以上是关于CMake 使用其他静态库构建静态库的主要内容,如果未能解决你的问题,请参考以下文章

CMake--静态库与动态库构建

使用cmake构建静态库的静态库

CMake-构建静态库的困难

CMake 学习四:CMake 构建静态库和动态库

从父 cmake 动态/静态库构建 cmake 静态库的最佳方法

使用 cmake 如何静态链接一些库和动态链接其他库?