You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:07:28