如何使用CMake和C ++创建可分发文件?

我正在尝试基于ros构建一个可执行文件,并将其分发到不同的Linux机器上,它在我正在开发的机器上是完全可用的(因为它包含它链接的所有*.so文件) ,但是当我尝试在另一台计算机上运行可执行文件时,找不到它们。

是否可以将这些.so文件添加到可执行文件中,或者使用所有必需的库来创建压缩目录,以便能够在任何计算机上运行该可执行文件?

我正在关注this tutorial,而我的CMakeLists.txtthis one的精确副本。

该软件运行正常,我无法分发。有可能做到吗?

谢谢大家

s20072290 回答:如何使用CMake和C ++创建可分发文件?

您有几种选择:

  1. 构建所有静态库依赖项,然后生成一个大的静态链接可执行文件。
  2. 保持二进制链接,并使用qt安装程序框架或类似InstallBuilder的替代程序将应用程序及其依赖项打包。
  3. 创建独立于发行版的软件包:SnappyFlatpakAppImage
,

最低,您可以使用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,它将为您提供依赖的库。

工作流程如下

  1. 创建一个临时的构建目录(假设我们位于根源目录中)mkdir build
  2. cd build
  3. cmake ..
  4. 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

大家都在问