如何使用CMake和C++创建可分发文件
How can I create a distributable with CMake and C++?
我正在尝试构建一个基于ros的小可执行文件,我可以将其分发到不同的Linux机器上,它在我开发它的机器上功能齐全(因为它包含了它链接的所有*.so
文件(,但当我试图在另一台机器上运行可执行文件时,它找不到它们。
有没有办法将这些.so
文件添加到可执行文件中,或者创建一个包含所有必要库的压缩目录,以便能够在任何机器中运行此可执行文件?
我正在学习本教程,我的CMakeLists.txt
正是本教程的副本。
这个软件运行良好,我就是不能分发它。有可能吗?
谢谢大家
通过在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/
目录,该目录已经包含了可执行文件和共享库文件。
测试用例
我针对自己的简单程序进行了测试,该程序依赖于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]
...
您有几个选项:
- 构建所有静态库依赖项,然后生成一个大的静态链接可执行文件
- 保持二进制链接,并使用qt安装程序框架或类似InstallBuilder的替代方法将应用程序及其依赖项打包
- 创建独立于发行版的软件包:Snappy、Flatpak或AppImage
相关文章:
- 终端不会为C++文件创建.exe文件吗
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 文件创建并不总是成功
- 如何使用 QFile、c++ 从文件创建整数数组
- 您可以使用 makefile 从 .o 对象文件创建 C++ 文件吗?
- 从函数中的dat文件创建一个2维数组
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何从现有的生成文件创建 CMake 文件?
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 从文本文件创建 2D 字符串矢量
- ofStream: - 尽管文件创建了,但文本文件上没有输出
- 从语言文件创建JSON对象
- 将文本文件创建到节点.js的插件C++