问题描述
功能包名为paddle_detection
在工作空间下, 通过catkin_make可以正常通过编译且执行无异常,
可以通过bloom-generate rosdebian
生成依赖
但是在将其打包成deb包的过程中fakeroot debian/rules binary
报错
shell
fatal error: paddle_detection/paddle_detectionConfig.h: No such file or directory
44 | #include <paddle_detection/paddle_detectionConfig.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决思路
之前用过一个局部路径规划包, teb_local_planner
, 里面包含了动态参数配置, 而且可以成功编译打包, 因此把他的代码拉了下来去分析他的CMakelists.txt, 最终找到了一些区别, 添加后解决
原因
在catkin_make
的过程中, 程序会自动根据ros的规则去配置与生成头文件, 即只要在CMakelists.txt中添加了
cmake
generate_dynamic_reconfigure_options(
config/paddle_detection.cfg
#...
)
就会自动生成 paddle_detectionConfig.h
的头文件, 并被其他文件引用
但是在fakeroot debian/rules binary
的过程中, 这一步还没有完成时就会同步开启其他文件的编译, 因此会导致无法找到paddle_detection/paddle_detectionConfig.h
这个头文件的错误
解决
在添加完上面的语句后, 再添加一句
add_dependencies(paddle_detection ${PROJECT_NAME}_gencfg)
这就指定了 paddle_detection
这个可执行文件的构建依赖于 ${PROJECT_NAME}_gencfg
目标的完成。这里的 ${PROJECT_NAME}_gencfg
是一个由 generate_dynamic_reconfigure_options
自动生成的目标,它负责处理 dynamic_reconfigure
的配置文件(在这个例子中是 paddle_detection.cfg
)。
这种依赖关系的具体含义是:
- 当你运行
make
命令来构建你的项目时,CMake 会首先确保${PROJECT_NAME}_gencfg
目标已经完成。这意味着所有与动态配置相关的自动生成的代码都会在尝试构建paddle_detection
之前完成。 - 这样做的目的是确保在编译
paddle_detection
时,所有由dynamic_reconfigure
生成的头文件都已经存在并可用。这些头文件通常包含了必要的配置类和方法,它们由paddle_detection.cfg
定义的参数生成。
总结
在进行动态参数的生成与配置时, 至少在CMakelist中包含两项内容
cmake
generate_dynamic_reconfigure_options(
config/paddle_detection.cfg
#...
)
add_dependencies(paddle_detection ${PROJECT_NAME}_gencfg)
补充一点
在生成消息类型时也会遇到这样的问题, ROS会自动把msg, srv等自动转换成.h文件, 但是在进行单独打包时需要注意, 在添加可执行文件时应该完成对这些消息类型的依赖, 否则会报类似的错误
cmake
add_executable(getRT src/tool/getRT.cpp
)
add_dependencies(getRT ${PROJECT_NAME}_generate_messages_cpp) #这一句就是为了保证消息类型先编译
target_link_libraries(getRT ${catkin_LIBRARIES} )
target_include_directories(getRT PRIVATE ${PYTHON_INCLUDE_DIRS})