ros catkin包构建文件CMakeLists.txt介绍

CMakeLists.txt 文件为 CMake构建系统构建软件包的输入文件。描述如何编译代码、安装到哪里。catkin使用的CMakeLists.txt文件是在cmake的基础上做了一层封装。

参考:
http://wiki.ros.org/catkin/CMakeLists.txt

总体结构和顺序

CMakeLists.txt文件必须遵循下面的格式,否则包可能无法正确编译,下面的顺序很重要:

  1. 指定CMake需要的版本 (cmake_minimum_required)

  2. 指定包名 (project())

  3. 寻找构建所需的其他cmake/catkin包 (find_package())

  4. Enable Python module support (catkin_python_setup())

  5. Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())

  6. Invoke message/service/action generation (generate_messages())

  7. Specify package build info export (catkin_package())

  8. 指定需要构建的库或者可执行文件 (add_library()/add_executable()/target_link_libraries())

    可以理解为指定构建目标。

  9. Tests to build (catkin_add_gtest())

  10. 安装规则 (install())

具体函数

cmake版本

所有的catkin CMakeLists.txt文件都必须以指定cmake版本为开始,catkin要求cmake版本在2.8.3及以上。

cmake_minimum_required(VERSION 2.8.3)

这其实是cmake的语法。

包名

project(robot_brain)

添加了这句话之后就可以使用cmake内置的环境变量${PROJECT_NAME}来获取包名了。

这也是cmake的语法。

寻找依赖的cmake包

寻找需要用到的其他 CMake packages,用函数 find_package。
至少依赖一个关于 catkin 的功能包

find_package(catkin REQUIRED)

也就是说对于cmake而言,catkin是一个软件包。
REQUIRED选项表示该包是必须的,如果找不到则停止cmake。

find_package(catkin REQUIRED COMPONENTS nodelet)

COMPONENTS选项表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行。
当然,也可以写成这样:

find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)

只不过比较不方便。
find_package是cmake自身的语法,所以会放在cmake中去介绍。

catkin_package

catkin_package()是catkin提供的CMake宏,提供catkin指定的构建信息。该函数有6个参数:

  • INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
  • LIBRARIES - The exported libraries from the project
  • CATKIN_DEPENDS - Other catkin projects that this project depends on
  • DEPENDS - Non-catkin CMake projects that this project depends on. For a better understanding, see this explanation.
  • CFG_EXTRAS - Additional configuration options
    例子:
catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)

指定构建目标

所谓的目标就是最终生成的库或者可执行程序。目标的名字必须唯一。


修改目标输出时的名字
可以通过 set_target_properties()来修改目标的名字:

set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")

上面语句会把t rviz_image_view目录在构建和安装时重命名成image_view。一般也不会有人闲得蛋疼改名字。
定制输出目录

set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})

在指定构建目标之前,你需要指定目标所依赖的资源的路径,如头文件,库的路径:
添加头文件路径

include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

include参数表示${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS}目录下的include目录也作为头文件路径。

添加库路径

link_directories(~/my_libs)

catkin推荐使用find_packaged而非这个函数。

可执行程序目标

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

指定由这几个cpp文件生成可执行文件,这就类似于Makefile的依赖。

库目标

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

这里库的名字不需要写成libxxx.so,或者libxxx.a,只需要写成xxx就可以了,默认生成动态库,可以加static或者share选项指定。
如:

add_library(${PROJECT_NAME} static ${${PROJECT_NAME}_SRCS})

Messages, Services, and Action Targets(暂未翻译)

使能python模块支持

catkin_python_setup()

在调用generate_messages()andcatkin_package()之前调用它。

单元测试

catkin定义的一个用于处理gtest格式单元测试的宏

if(CATKIN_ENABLE_TESTING)
  catkin_add_gtest(myUnitTest test/utest.cpp)
endif()

指定安装规则

其实就是生成Makefile的make install目标。

安装可执行程序、动态库、静态库:

install(TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)

cmake install函数参数:

  • TARGETS - 指定被安装的目标
  • ARCHIVE DESTINATION - Static libraries and DLL (Windows) .lib stubs
  • LIBRARY DESTINATION - Non-DLL shared libraries and modules
  • RUNTIME DESTINATION - Executable targets and DLL (Windows) style shared libraries

安装可执行程序:

install(TARGETS ${PROJECT_NAME}_node
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

python包必须被安装到能够被引用的路径

install(TARGETS python_module_library
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
)

安装 Python Executable Scripts

catkin_install_python(PROGRAMS scripts/myscript
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

安装头文件

install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  PATTERN ".svn" EXCLUDE
)

install(DIRECTORY include/
  DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
  PATTERN ".svn" EXCLUDE
)

安装 roslaunch Files or Other Resources

install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  PATTERN ".svn" EXCLUDE)

# install moveit plugin description file
install(FILES robot_moveit_plugins.xml
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值