catkin CMakeLists.txt

catkin cmakelist.txt wiki 写的超详细

1.整体结构和框架

  1. Required CMake Version (cmake_minimum_required)
  2. Package Name (project())
  3. Find other CMake/Catkin packages needed for build (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. Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
  9. Tests to build (catkin_add_gtest())
  10. Install rules (install())

2.详解:

1.版本:

  • cmake_minimum_required(VERSION 2.8.3)

2.包名:

  • project(robot_brain)

请注意,在CMake中,您可以在CMake脚本中的任何位置使用变量$ {PROJECT_NAME}在任何需要的位置引用项目名称。

3.寻找相关的CMake包

  • find_package(catkin REQUIRED)

如果您的项目依赖于其他湿包装,它们会自动变成catkin的组件(就CMake而言)。 而不是在这些包上使用find_package,如果将它们指定为组件,它将使生活更轻松。 例如,如果使用包nodelet。

  • find_package(catkin REQUIRED COMPONENTS nodelet)

注意:您应该只找到要为其构建标志的组件组件。 您不应该添加运行时依赖项。

  • find_package(catkin REQUIRED)
  • ​​​find_package(nodelet REQUIRED)

find_package()有什么作用?

如果CMake通过find_package找到包,则会导致创建多个CMake环境变量,这些变量提供有关找到的包的信息。 稍后可以在CMake脚本中使用这些环境变量。 环境变量描述了包导出头文件的位置,源文件所在的位置,包所依赖的库以及这些库的路径。名字总是遵循  <PACKAGE NAME>_<PROPERTY>:

  • <NAME>_FOUND - Set to true if the library is found, otherwise false
  • <NAME>_INCLUDE_DIRS or <NAME>_INCLUDES - The include paths exported by the package
  • <NAME>_LIBRARIES or <NAME>_LIBS - The libraries exported by the package
  • <NAME>_DEFINITIONS - ?

为什么Catkin包被指定为组件?

Catkin包装不是catkin的真正组成部分。 相反,CMake的组件功能被用于catkin的设计,以节省大量的打字时间。

对于catkin包,如果find_package它们作为catkin的组件,这是有利的,因为使用catkin_前缀创建了一组环境变量。 例如,假设您在代码中使用了包nodelet。 寻找包的推荐方法是:

  • find_package(catkin REQUIRED COMPONENTS nodelet)

这意味着nodelet导出的包含路径,库等也会附加到catkin_变量。 例如,catkin_INCLUDE_DIRS不仅包含catkin的包含路径,还包含nodelet的包含路径! 这将在以后派上用场。

我们也可以自己find_package nodelet:

  • find_package(nodelet)

Boost

如果使用C ++和Boost,则需要在Boost上调用find_package()并指定您正在使用的Boost的哪些方面作为组件。 例如,如果你想使用Boost线程,你会说:

  • find_package(Boost REQUIRED COMPONENTS thread)

4.catkin_package()

catkin_package()是一个catkin提供的CMake宏。这是为构建系统指定catkin特定信息所必需的,而构建系统又用于生成pkg-config和CMake文件。

在使用add_library()或add_executable()声明任何目标之前,必须调用此函数。该函数有5个可选参数:

  • INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package 为包输出的include路径
  • LIBRARIES - The exported libraries from the project 从项目导出的库
  • CATKIN_DEPENDS - Other catkin projects that this project depends on  该项目依赖的其他catkin项目
  • DEPENDS - Non-catkin CMake projects that this project depends on. For a better understanding, see this explanation.该项目所依赖的非catkin CMake项目。
  • CFG_EXTRAS - Additional configuration options  其他配置选项

这表示包文件夹中的“include”文件夹是导出头文件所在的位置。 CMake环境变量$ {PROJECT_NAME} 来自您之前传递给project()函数的任何内容,在这种情况下它将是“robot_brain”。 “roscpp”+“nodelet”是构建/运行此包需要存在的包,“eigen”+“opencv”是构建/运行此包时需要存在的系统依赖性。

5.指定构建目标

构建目标可以采用多种形式,但通常它们代表两种可能性之一:

  1. 可执行目标 - 我们可以运行的程序
  2. 库目标 - 构建和/或运行时可由可执行目标使用的库

目标命名:

非常重要的是要注意,catkin中的构建目标的名称必须是唯一的,无论它们是构建/安装到哪个文件夹。 这是CMake的要求。 但是,目标的唯一名称仅在CMake内部是必需的。 可以使用set_target_properties()函数将目标重命名为其他目标:

  • set_target_properties(rviz_image_view
  •                       PROPERTIES OUTPUT_NAME image_view
  •                       PREFIX "")

这将在构建和安装输出中将目标rviz_image_view的名称更改为image_view。

自定义输出目录

虽然可执行文件和库的默认输出目录通常设置为合理的值,但在某些情况下必须自定义。即包含Python绑定的库必须放在不同的文件夹中,以便可以在Python中导入:

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

6.include路径和lib路径

在指定目标之前,您需要指定可以为所述目标找到资源的位置,特别是头文件和库:

  • Include Paths - Where can header files be found for the code (most common in C/C++) being built
  • Library Paths - Where are libraries located that executable target build against?
  • include_directories(<dir1>, <dir2>, ..., <dirN>)
  • link_directories(<dir1>, <dir2>, ..., <dirN>)

include_directories()

include_directories的参数应该是find_package调用生成的* _INCLUDE_DIRS变量以及需要包含的任何其他目录。 如果您使用catkin和Boost,则include_directories()调用应如下所示:

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

第一个参数“include”表示包中的include /目录也是路径的一部分。

link_directories()

CMake link_directories()函数可用于添加其他库路径,但不建议这样做。 所有catkin和CMake软件包在find_packaged时自动添加其链接信息。 只需链接到target_link_libraries()中的库

  • link_directories(~/my_libs)

 this cmake thread 查看在link_directories()上使用target_link_libraries()的详细示例。

可执行目​​​​​​文件

要指定必须构建的可执行目标,我们必须使用add_executable()CMake函数。

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

这将构建一个名为myProgram的目标可执行文件,它由3个源文件构成:src / main.cpp,src / some_file.cpp和src / another_file.cpp。

target_link_libraries

使用target_link_libraries()函数指定可执行目标链接的库。这通常在add_executable()调用之后完成。如果找不到ros,请添加$ {catkin_LIBRARIES}。if ros is not found.

  • target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

请注意,在大多数用例中不需要使用link_directories(),因为该信息是通过find_package()自动引入的。

7.Messages, Services, and Action Targets

ROS中的消息(.msg),服务(.srv)和动作(.action)文件在构建和使用ROS包之前需要特殊的预处理器构建步骤。 这些宏的关键是生成特定于编程语言的文件,以便可以使用所选编程语言中的消息,服务和操作。 构建系统将使用所有可用的生成器(例如gencpp,genpy,genlisp等)生成绑定。

提供了三个宏来分别处理消息,服务和操作:

  • add_message_files
  • add_service_files
  • add_action_files

然后,必须在调用生成的宏之后调用这些宏:

  •  generate_messages()

重要的先决条件/限制

1.这些宏必须在catkin_package()宏之前,以便生成正常工作。

2.您的catkin_package()宏必须对message_runtime具有CATKIN_DEPENDS依赖关系。

  • catkin_package(
  •  ...
  •  CATKIN_DEPENDS message_runtime ...
  •  ...)

3.您必须将find_package()用于包messagesegeneration,可以单独使用,也可以作为catkin的一个组件使用:

  • find_package(catkin REQUIRED COMPONENTS message_generation)

4.package.xml文件必须包含对message_generation的构建依赖关系以及对message_runtime的运行时依赖性。如果依赖性是从其他包传递的,那么这不是必需的。

5.如果您有一个目标(甚至可以传递)依赖于需要构建消息/服务/操作的其他目标,则需要在目标catkin_EXPORTED_TARGETS添加显式依赖项,以便以正确的顺序构建它们。 除非您的软件包确实不使用ROS的任何部分,否则这种情况几乎总是适用。 不幸的是,这种依赖关系不能自动传播。 (some_target是add_executable()设置的目标的名称):

  •   add_dependencies(some_target ${catkin_EXPORTED_TARGETS})

6.如果您有一个构建消息和/或服务的包以及使用它们的可执行文件,则需要在自动生成的消息目标上创建显式依赖项,以便以正确的顺序构建它们。 (some_target是add_executable()设置的目标的名称):

  • add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})

7.如果您的包装满足上述两个条件,则需要添加两个依赖关系,即:

  •   add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

8.使能Python模块支持

如果你的ROS包提供了一些Python模块,你应该创建一个setup.py文件并调用

  • catkin_python_setup()

在调用generate_messages()和catkin_package()之前。

9.单元测试

有一个特定于catkin的宏用于处理名为catkin_add_gtest()的基于gtest的单元测试。

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

10.可选步骤:指定可安装目标

在构建时间之后,将目标放置到catkin工作空间的开发空间中。 但是,我们通常希望将目标安装到系统(有关安装路径的信息可以在REP 122中找到),以便其他人或本地文件夹可以使用它们来测试系统级安装。 换句话说,如果您希望能够对代码进行“make install”,则需要指定目标应该结束的位置。

这是使用CMake install()函数完成的,该函数作为参数:

  • TARGETS - which targets to install
  • ARCHIVE DESTINATION - Static libraries and DLL (Windows) .lib stubs
  • LIBRARY DESTINATION - Non-DLL shared libraries and modules  非DLL共享库和模块
  • RUNTIME DESTINATION - Executable targets and DLL (Windows) style shared libraries 可执行目标和DLL(Windows)样式共享库

除了这些标准目标,一些文件必须安装到特殊文件夹。即 必须将包含Python绑定的库安装到可在Python中导入的其他文件夹中:

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

安装Python可执行脚本

对于Python代码,安装规则看起来不同,因为没有使用add_library()和add_executable()函数,以便CMake确定哪些文件是目标以及它们是什么类型的目标。 而是在CMakeLists.txt文件中使用以下内容:

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

如果您只安装Python脚本并且不提供任何模块,则既不需要创建上面提到的setup.py文件,也不需要调用catkin_python_setup()。

安装头文件

头文件也必须安装到“include”文件夹,这通常是通过安装整个文件夹的文件(可选择按文件名模式过滤并排除SVN子文件夹)来完成的。 这可以通过如下安装规则来完成:

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

或者如果include下的子文件夹与包名称不匹配:

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

安装roslaunch文件或其他资源

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

猜你喜欢

转载自blog.csdn.net/xiaoma_bk/article/details/85318155
今日推荐