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

标签 c++ cmake executable

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

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

我正在关注 this tutorial我的 CMakeLists.txtthis one 的精确拷贝.

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

谢谢大家

最佳答案

最低限度,您可以使用 cpack (已经作为 cmake 的一部分,当你安装它时)通过在你的 CMakeLists.txt 的最底部添加以下内容

...
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]
...

关于c++ - 如何使用 CMake 和 C++ 创建可分发的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58874611/

相关文章:

ruby - 使用 wxruby 为 linux 创建一个 ruby​​ 可执行文件

python-3.x - 找不到C :\nltk_data while creating executable using pyinstaller

visual-studio - 如何禁用 cmake 的 Visual Studio 宏,它会在 CMakeLists.tx 更改时提示用户重新加载解决方案

cmake - 什么是 CMAKE_BUILD_TYPE : Debug, Release、RelWithDebInfo 和 MinSizeRel?

c++ - 在Windows上使用MinGW构建mysql-connector-c++-8.0.17-src

c++ - cmake:如何迭代目录中的所有源文件并将每个源文件构建为可执行文件?

c++ - Boost::asio socket - 如何在 'throw' 中创建 read_some "timeout"?

c# - C++ 中的 nullptr 与 C# 中的 null 相同吗?

c++ - 如何在 SWIG 中为 C++ 创建模板函数?

c++ - 具有 0 个参数的函数 - void vs void*?