ROS:关于功能包下CMakeLists.txt和package.xml的修改
当我们往ROS包中添加cpp
文件时,往往需要修改功能包下的这两个文件。下面讨论一些常见情况下的这两个文件的修改。
Sit1:没有添加任何依赖
当cpp
文件没有添加任何外部依赖时,或者在创建功能包时就已经添加了相关依赖时,我们仅需要编译创建的cpp
文件即可,不需要做其他的操作。CMakeLists.txt
修改如下:
# 设置string_publisher.cpp
add_executable(string_publisher src/string_publisher.cpp) # 可执行文件名 cpp文件路径
target_link_libraries(string_publisher ${catkin_LIBRARIES})
# 设置string_subscriber.cpp
add_executable(string_subscriber src/string_subscriber.cpp)
target_link_libraries(string_subscriber ${catkin_LIBRARIES})
Sit2:创建自定义消息或服务
当我们创建自定义消息或服务时,除了需要编译cpp
文件外,还需要手动添加相关依赖。
-
在
package.xml
中添加相关依赖;<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
-
修改
CMakeLists.txt
文件。... find_package(catkin REQUIRED COMPONENTS ... message_generation ) ... ################################################ ## Declare ROS messages, services and actions ## ################################################ ... add_message_files(FILES Person.msg) # or add_service_files(FILES PersonSrv.srv) generate_messages(DEPENDENCIES std_msgs) ... ################################### ## catkin specific configuration ## ################################### ... catkin_package( # INCLUDE_DIRS include # LIBRARIES learning_topic CATKIN_DEPENDS ... message_runtime # DEPENDS system_lib )
修改好后,使用catkin_make
进行编译,就会生成自定义消息的头文件。自定义服务的修改内容与自定义消息类似。
生成相关头文件后,就可以开始编译cpp
文件,与第一种情况相同,需要修改CMakeLists.txt
:
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp) # new
Sit3:cpp文件中使用到了未添加的依赖
如我在某个功能包中曾使用了#<message_filters/xxx.h>
一系列关于message_filters
的头文件,因此需要在这两个文件中添加message_filters
的依赖。
package.xml
修改如下:
<build_depend>message_filters</build_depend>
<build_export_depend>message_filters</build_export_depend>
<exec_depend>message_filters</exec_depend>
CMakeLists.txt
修改如下:
...
find_package(catkin REQUIRED COMPONENTS
...
message_filters
)
...
###########
## Build ##
###########
include_directories(
include # 若功能包的include文件中有需要用到的头文件,则需要添加这个
${catkin_INCLUDE_DIRS}
)
...
add_executable(robot_navigation_pub src/robot_navigation_pub.cpp)
target_link_libraries(robot_navigation_pub ${catkin_LIBRARIES})