ROS下新建包的CMakelists.txt配置

CMakelists.txt包含的内容及必须遵守的先后顺序:
(1)Required CMake Version (cmake_minimum_required)
(2)Package Name (project())
(3)Find other CMake/Catkin packages needed for build (find_package())
(4)Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
(5)Invoke message/service/action generation (generate_messages())
(6)Specify package build info export (catkin_package())
(7)Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
(8)Tests to build (catkin_add_gtest())
(9)Install rules (install())
下面将一一介绍:
1.设置Cmake的版本。
例:cmake_minimum_required(VERSION 2.8.3)
2.设置项目名称(包的名称),该名称会赋给${PROJECT_NAME},后续可以使用。
例如:project(robot_brain)
3.使用find_package()找出编译本项目所需要的Cmake包,cmake包是必须的。
find_package()找到包后会定义以下变量:

<依赖包>_FOUND : 包找到,设置为true
<依赖包>_INCLUDE_DIRS or <依赖包>_INCLUDES : 包提取的include路径
<依赖包>_LIBRARIES or <依赖包>_LIBS : 包提取的库文件

(1)推荐使用的格式:find_package(catkin REQUIRED COMPONENTS 依赖包名称(例:nodelet)......)
   把其他包都作为catkin的组件。
    优点: catkin_INCLUDE_DIRS不仅包含catkin的include路径,还包含所有依赖包的include路径。
           同理:catkin_LIBRARIES
(2)使用Boost时要采用组件的形式指出使用boost的哪个方面。
    例如:find_package(Boost REQUIRED COMPONENTS thread)

4.catkin_package()指出cmake生成pkg-config和CMake文件所必须的信息。
  catkin_package()包含参数:
  INCLUDE_DIRS:包提取的include路径。
  LIBRARIES:项目提取的库文件路径。
  CATKIN_DEPENDS:项目依赖的其他cmake包。
  DEPENDS:项目依赖的非cmake包。
  CFG_EXTRAS:额外配置。
例:
catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)
5.指定编译生成目标文件。
(1)设置目标文件名称,该名称唯一,而且可以重命名。
 例:set_target_properties(rviz_image_view
                           PROPERTIES OUTPUT_NAME image_view //重命名
                           PREFIX "")
(2)自定义可执行目标文件、库的输出目录。
  例:set_target_properties(python_module_library
                       PROPERTIES LIBRARY_OUTPUT_DIRECTORY
                      ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})
(3)指定头文件和库:Include和Library路径。
  include_directories(<dir1>, <dir2>, ..., <dirN>) //编译目标文件需要的头文件
  link_directories(<dir1>, <dir2>, ..., <dirN>)  //编译目标文件需要的库文件
  例如:include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
   这里的include指的是包下的include文件夹,如果里面有头文件必须在此包含include。
   例:link_directories(~/my_libs) //指定链接的库文件,一般不需要,因为find_packge()已经自动添加了。
(4)添加目标文件或库。
  格式:add_executable/library(目标文件   源文件)
  例:add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
      add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})
(5)目标文件链接的库。
 格式: target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)
 例如:add_executable(foo src/foo.cpp)
       add_library(moo src/moo.cpp)
       target_link_libraries(foo moo)  -- This links foo against libmoo.so
注:一般不需要link_libraries,因为find_packge()已经自动添加了。但find_packge()不能添加的,要像这样进行添加。
6.Messages, Services, and Action 目标文件。
格式:
 find_package(catkin REQUIRED COMPONENTS ...)
 add_message_files(...) //消息
 add_service_files(...) //服务
 add_action_files(...)  //行为
 generate_messages(...) //必须引用
注意:(1)find_package()必须包含message_generation组件。
     find_package(catkin REQUIRED COMPONENTS message_generation...)
(2)catkin_package()必须添加运行依赖message_runtime。
 catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)
 如果其他的依赖包中已经添加了,那么你就不需要在这个包中添加了。
(3)如果在这个包中你的可执行程序用了这个包中定义的消息或服务,你需要在自动生成消息目标文件之前创建明确的依赖,
     使编译按正确的顺序执行。
例:add_dependencies(some_target ${PROJECT_NAME}_generate_messages_cpp)

 

你可能感兴趣的:(ROS下新建包的CMakelists.txt配置)