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

时间:2018-04-20 15:31:23

标签: cmake openssl static-libraries

我的问题如下:

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

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

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

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

实际上我没有工作CMake文件,所以我不能包含一个例子。我只是想找一个如何做的方向。

如何开始的简短建议将受到高度赞赏。

2 个答案:

答案 0 :(得分: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个参数中,或者创建一个脚本模板,使用{{1}替换CMake生成时的值然后让自定义命令运行该脚本。

也就是说,如果外部消费者都在使用CMake,我会完全跳过这个,只需让你的库的安装过程生成CMake包配置文件,声明对OpenSSL库的依赖。

答案 1 :(得分:-1)

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

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

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