最低限度,您可以通过在CMakeLists.txt 的最底部添加以下内容来使用cpack(在安装时已作为cmake 的一部分)
...
install(TARGETS myapp
RUNTIME
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/bin)
install(CODE "
include(BundleUtilities)
fixup_bundle(${CMAKE_CURRENT_SOURCE_DIR}/bin/myapp \"\" \"\")
")
...
include(CPack)
主要是fixup_bundle,它将为您遍历依赖库。
工作流程如下
- 创建一个临时构建目录(假设我们在根源目录)
mkdir build
cd build
cmake ..
cpack
您的二进制可执行文件的结果(前提是您已经为此添加了此类 cmake 命令)以及我们上面所做的.so 文件将位于<project-source-root-dir>/bin 目录中。
这还没有完全利用cpack 提供的功能,即构建与我们选择的文件或源代码捆绑在一起的.tar.gz 文件。但是我们可以简单地包含一个自定义脚本来处理生成的bin/ 目录,该目录已经包含了可执行文件和共享库文件。
测试用例
我针对我自己的simple program 进行了测试,它依赖于 OpenSSL 的 SSL + Crypto 组件和 libcurl 的共享库。遵循上述步骤。我在bin/ 目录中得到了以下内容。
libcrypto.so.1.1 libcurl.so libssl.so.1.1 tt
并通过我得到的readelf -d <executable-file> 进行验证
Dynamic section at offset 0x9be8 contains 30 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.1.1]
0x0000000000000001 (NEEDED) Shared library: [libcurl.so]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
...