我正在尝试构建一个基于 ros 的小可执行文件,我可以将其分发到不同的 Linux 机器上,它在我正在开发它的机器上功能齐全(因为它包含所有 *.so
它已链接的文件),但是当我尝试在另一台机器上运行可执行文件时它找不到它们。
有没有办法将这些 .so
文件添加到可执行文件中,或者创建一个包含所有必要库的压缩目录,以便能够在任何机器上运行该可执行文件?
我正在关注 this tutorial我的 CMakeLists.txt
是 this 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它将为您通过依赖库。
工作流程如下
- 创建一个临时构建目录(假设我们在根源目录)
mkdir build
-
cd build
-
cmake ..
-
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/