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(
link_directories(
例如: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(
例如: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)