您有几种选择:
- 构建所有静态库依赖项,然后生成一个大的静态链接可执行文件。
- 保持二进制链接,并使用qt安装程序框架或类似InstallBuilder的替代程序将应用程序及其依赖项打包。
- 创建独立于发行版的软件包:Snappy,Flatpak或AppImage。
,
最低,您可以使用cpack
(在安装cmake
时作为CMakeLists.txt
的一部分),方法是在{{1} }
...
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进行了测试,该https://i.imgur.com/qKWqf6S.mp4依赖于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]
...
本文链接:https://www.f2er.com/3096367.html