C++ linux打包运行方案(cmake)

打印 上一主题 下一主题

主题 1577|帖子 1577|积分 4731

配景

使用C++编写的一个小项目,需要打包成ubuntu下的可实行文件,方便分发给其他ubuntu实行,因为docker镜像方案过于臃肿,所以需要把项目的动态库都打在软件包中,分发之后可以直接运行,而不需要再重复安装。
动态库

经过依靠精简和梳理,项目最终必须依靠的动态库包括:pcl, yaml, rosbag(用于读取rosbag包)
打包方案

第一步尝试将所有动态库转为静态库安装,发现 pcl 和 rosbag 间接依靠太多,只好暂时先将yaml库转为静态库,这里使用的方式是直接把yaml的源码包罗进来。
动态库转静态库

这里把yaml的源码下载到 项目目录/thirdparty/yaml-cpp目录结构如下:

在CMakeLists.txt中, 相干改动如下:
  1. ...
  2. # 添加子目录编译 yaml-cpp 库
  3. add_subdirectory(thirdparty/yaml-cpp)
  4. ...
  5. target_include_directories(ExeFileName PUBLIC
  6.   ...
  7.   ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/include
  8. )
  9. target_link_libraries(ExeFileName PUBLIC
  10.   ...
  11.   yaml-cpp
  12.   ...
  13. )
  14. ...
复制代码
动态库打到软件包中

这里用到了linuxdeploy-x86_64.AppImage工具,安装方式为:
  1. wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O /usr/local/bin/linuxdeploy
  2. chmod +x /usr/local/bin/linuxdeploy
复制代码
我们以pcl库为例,现实依靠库链接方式保持稳定,只是需要在CMakeLists.txt末了加上对应的用于linuxdeploy的内容即可:
  1. ...
  2. find_package(PCL REQUIRED COMPONENTS io)
  3. ...
  4. target_include_directories(ExeFileName PUBLIC
  5.   ${PCL_INCLUDE_DIRS}
  6.   ...
  7. )
  8. # 链接库
  9. target_link_libraries(ExeFileName PUBLIC
  10.   ${PCL_LIBRARIES}
  11.   ...
  12. )
  13. # 设置安装路径为 AppDir 结构
  14. install(TARGETS ExeFileName DESTINATION usr/bin)
  15. # 设置 RPATH(确保运行时库加载正确)
  16. set_target_properties(ExeFileName PROPERTIES
  17.     INSTALL_RPATH "$ORIGIN/../lib"  # 相对路径指向 ../lib
  18.     BUILD_WITH_INSTALL_RPATH TRUE
  19.     INSTALL_RPATH_USE_LINK_PATH TRUE
  20. )
  21. # 修改原有的打包命令,确保在 Ubuntu 18.04 中兼容
  22. add_custom_target(bundle_appimage_all_in_one
  23.     COMMAND mkdir -p AppDir/usr/lib
  24.     COMMAND linuxdeploy --appdir AppDir   
  25.         -e $<TARGET_FILE:ExeFileName>        
  26.         --output appimage     
  27.         --plugin none            
  28.         --executable $<TARGET_FILE:ExeFileName>  # 显式指定可执行文件
  29.     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  30.     DEPENDS ExeFileName
  31. )
复制代码
  注意: 只管在ubuntu低版本好比18.04上进行打包,以确保高版本ubuntu能向下兼容运行
  在编译打包脚本中需要增加linuxdeploy指令进行打包:
  1. linuxdeploy --appdir AppDir -e ./ExeFileName \
  2.     --library /lib/x86_64-linux-gnu/libusb-1.0.so.0 \
  3.     --library /lib/x86_64-linux-gnu/libexpat.so.1
复制代码
因为在运行时发现照旧报错,缺少依靠库,所以在linuxdeploy打包时把缺少的动态库显式指定出来。
运行

运行命令为:
  1. LD_LIBRARY_PATH=./AppDir/usr/lib ./AppDir/usr/bin/ExeFileName ...
复制代码
这里要强制带上LD_LIBRARY_PATH,这个问题有待办理,不外不影响使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表