ROS的工作空间用的时间一长,就会创建很多package,有些package的编译又用到了其他的package,这时单纯使用catkin_make
就会出现问题。比如package A用到了B,B里又用到了C。以往使用catkin_make --pkg
编译,但是可能会需要把所有的package都处理一遍,此时处理到A时就会报错,也就无法编译B和C。比较笨的方法就是在A的CMakeLists
里先把B和C注释掉,同样在B的CMakeLists
里把A注释掉,先用catkin_make --pkg C
编译C,再依次编译B和A。
经过研究发现使用add_dependencies
就可以解决这个问题,但是不能解决find_package
的问题
在A的CMakeLists
里这样写:1
2
3
4
5find_package(catkin REQUIRED COMPONENTS B C)
add_executable(A_program src/A_program.cpp)
add_dependencies(A_program B C ) # B C是package名称,不是编译结果的名称
target_link_libraries(A_program ${catkin_LIBRARIES} B_program C_program)add_dependencies
必须在add_executable
之后,可以在target_link_libraries
之前或之后。 这样在编译A的时候,会出现一句scanning dependencies
,这时编译器就会注意到A的依赖项,等依赖项完成后再编译A。同样在B的CMakeLists
里添加C作为依赖项。
有些package需要依赖自定义的消息或服务文件,也就是一个特殊的package,这就更简单了,有专门的命令: add_dependencies(your_program ${catkin_EXPORTED_TARGETS})
,不必用专门的package名称,用message函数可以看这个宏的内容,它是一大堆消息和服务名称。这样在编译的时候会出现这样的信息:
现在编译就快捷多了,直接用catkin_make
就可以编译整个工作空间,不必自己改编译顺序了。