如何用CMake/Catkin构建仅含指定文件的Debian包?
解决CMake/CPack打包Debian包时混入Catkin生成的多余文件问题
我之前也碰到过一模一样的坑——Catkin的消息生成模块会偷偷自动添加一堆系统路径的安装规则,结果被CPack全盘打包进来,完全偏离了我们只想打包指定文件的需求。针对你的场景,咱们从几个关键节点入手修复:
1. 阻止Catkin自动安装消息相关文件
问题核心就是my_msgs里的Catkin配置会默认把生成的消息头文件、元数据等安装到/usr/share、/usr/include这类系统路径,而CPack会把所有通过install()(包括Catkin自动插入的)的内容都纳入包中。
修改my_msgs/CMakeLists.txt,添加一行跳过Catkin的默认安装流程:
project(my_msgs) # 关键:告诉Catkin不要自动安装任何消息相关文件到系统路径 set(CATKIN_SKIP_INSTALL ON) find_package(catkin REQUIRED geometry_msgs message_generation std_msgs sensor_msgs ) add_message_files(FILES BoundingBox.msg) generate_messages( DEPENDENCIES geometry_msgs std_msgs sensor_msgs) # 保留catkin_package用于传递依赖,但CATKIN_SKIP_INSTALL会覆盖它的安装行为 catkin_package(CATKIN_DEPENDS message_runtime geometry_msgs std_msgs sensor_msgs)
2. 确保主程序能找到生成的消息头文件
因为跳过了Catkin的安装,主程序需要直接引用my_msgs构建生成的头文件路径。修改main/CMakeLists.txt,补充头文件包含:
project(main) # 包含my_msgs的源目录和构建时生成的头文件目录 include_directories( ${CMAKE_SOURCE_DIR}/my_msgs/include ${CMAKE_BINARY_DIR}/my_msgs/include ${catkin_INCLUDE_DIRS} ) find_package(catkin REQUIRED COMPONENTS roscpp my_msgs) add_executable(main main.cpp) target_link_libraries(main ${catkin_LIBRARIES}) # 确保主程序安装到你指定的opt目录 install(TARGETS main RUNTIME DESTINATION ${install_dir})
3. 限制CPack只打包我们指定的内容
在顶层CMakeLists.txt里,明确告诉CPack只处理主项目的安装规则,彻底忽略子目录的额外安装项:
# ... 原有配置保持不变 ... # CPACK debian settings set(CPACK_GENERATOR "DEB") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Matthew Mosley") # 仅打包当前主项目的安装目标,排除子项目的自动安装内容 set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};${PROJECT_NAME};ALL;/") include(CPack)
4. 验证打包结果
清理旧构建目录后重新执行流程:
rm -rf build && mkdir build && cd build cmake .. make cpack
现在生成的Deb包应该只会包含/opt/my-pkg/bin/main,那些/usr、/usr/local下的多余文件不会再出现在包里了。
内容的提问来源于stack exchange,提问作者Guilty Spark
相关产品推荐
相关产品推荐

