CMake 使用其他静态库构建静态库
Posted
技术标签:
【中文标题】CMake 使用其他静态库构建静态库【英文标题】:CMake building a static library with other static library 【发布时间】:2018-04-20 15:31:23 【问题描述】:我的问题如下:
我有 OpenSSL 作为静态库(libcrypto.a
和 libssl.a
)。
使用 MSys2/MinGW64 在 Windows 上编译。
除此之外,我还有一个基于OpenSSL
的小型自写库。
现在我想将 Crypto lib
从 OpenSSL
与我的库“捆绑”到一个“大”静态库,以便以后在 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
的应用程序时,它仍然需要存在lib1
、lib2
库。以上是关于CMake 使用其他静态库构建静态库的主要内容,如果未能解决你的问题,请参考以下文章