【问题标题】:How can I create a distributable with CMake and C++?如何使用 CMake 和 C++ 创建可分发的内容?
【发布时间】:2019-11-15 10:04:08
【问题描述】:

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

有没有办法将这些.so 文件添加到可执行文件中,或者创建一个包含所有必要库的压缩目录,以便能够在任何机器上运行这个可执行文件?

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

该软件运行良好,但我无法分发它。有可能吗?

谢谢大家

【问题讨论】:

    标签: c++ cmake executable


    【解决方案1】:

    最低限度,您可以通过在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,它将为您遍历依赖库。

    工作流程如下

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

    【讨论】:

      【解决方案2】:

      您有多种选择:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多