ROS下CmakeLists.txt模板

CmakeLists.txt模板

#Catkin需要3.0.2或更高版本的camke
cmake_minimum_required(VERSION 3.0.2)

#以包名作为cmake的项目工程名
project(robot_brain)

#添加构建项目时所用的依赖包,ROS项目中catkin是必须的
#注意:这里添加的依赖是用于构建项目的,而不是项目构建完成后运行时的依赖
find_package(catkin REQUIRED)
#如果使用了COMPONENTS(如下所示),则意味着将将后面的包以catkin组件的形式使用
find_package(catkin REQUIRED COMPONENTS nodelet)
#也可以这样写
find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)
#还是建议以组件形式使用,这是因为如果 CMake 通过 find_package 找到一个包,
#就会创建该包的CMake 环境变量,提供有关找到的包的信息。
# 环境变量描述了包导出头文件的位置、源文件的位置、包依赖的库以及这些库的路径,
#通常以 <PACKAGE NAME>_<PROPERTY>的形式命名,具体包括:
		#<NAME>_FOUND - 若库被找到则为true
		#<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES - 包所用到的头文件的路径
		#<NAME>_LIBRARIES or <NAME>_LIBS - 包所依赖的库
		#<NAME>_DEFINITIONS - ?
#每找到一个包都会有各自对应的环境变量,
#而如果以组件形式使用,则作为组件的包的信息都会放到前面的包的环境变量里,不单独生成,
#如nodelet的相关信息都在catkin_<PROPERTY>中。
#如果使用C++和Boost,则需要用find_package()来找Boost库,
#并指定Boost中的组件。如果想使用Boost线程,就可以写成:
find_package(Boost REQUIRED COMPONENTS thread)

#为包生成cmake配置文件用,包含四项
catkin_package(
   INCLUDE_DIRS include			#项目中头文件的路径
   LIBRARIES ${PROJECT_NAME}	#项目所创建的库
   CATKIN_DEPENDS roscpp nodelet#项目所依赖的其他catkin项目(构建/运行这个包需要存在的包)
   DEPENDS eigen opencv)		#项目所依赖的非catkin cmake项目(构建/运行这个包需要存在的系统依赖项)

#指定构建目标,主要有两种可构建目标形式:
#可执行文件(可运行的程序)、库文件(可供其他可执行文件在构建或运行期间使用的库)
#修改目标名称,如下将在构建和安装输出中将目标 rviz_image_view 的名称更改为 image_view。
set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")
#自定义目标输出目录,如下将目标放到bin文件夹下
set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY bin)
#在生成目标之前,要先写好包含路径和库路径,不然编译链接会失败
#include_directories 的参数应该是由 find_package 调用生成的 *_INCLUDE_DIRS 变量
#以及需要包含的任何其他目录。
# 如果您使用 catkin 和 Boost,则您的 include_directories() 调用应如下所示:
include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
#CMake link_directories() 函数可用于添加额外的库路径,但不建议这样做。 
#所有 catkin 和 CMake 包在 find_packaged 时都会自动添加链接信息。 
#只需链接到 target_link_libraries() 中的库
link_directories(~/my_libs)

#编译链接生成可执行文件
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
#编译链接生成库文件
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

#使用 target_link_libraries() 函数指定可执行目标需要链接到哪些库。 
#这通常在 add_executable() 调用之后完成。 例如:
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)
#使用ros的话,一定要链接这个库
target_link_libraries(${PROJECT_NAME}
  ${catkin_LIBRARIES}
)

#使用自定义的messages、services或者actions
#注意:1.需要在find_package中添加包message_generation
#     2.这几个项必须放在catkin_package之前
#	  3.需要在catkin_package中添加依赖message_runtime
find_package(catkin REQUIRED COMPONENTS message_generation)
add_message_files(...)
add_service_files(...)
add_action_files(...)
generate_messages(...)
catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)
#此外,需要在package.xml中添加构建依赖和运行依赖(如果这俩依赖能从别的包传递过来,则可不用添加)
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
#如果所构建的目标依赖于需要构建messages/services/actions的其他目标,
#则需要添加显式依赖关系以便它们能以正确的次序构建,
#如下some_target为add_executable()中所设定的构建目标名称
add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
#如果有一个构建messages and/or services并且使用它们的包,
#则也需要添加显式依赖关系以便能够先构建messages它们,再构建包的其他块
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
#如果所构建的包同时满足上述两个条件,则需要添加两个依赖项,即:
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

#例子
#如果在包中的msg目录下包含两个名为“MyMessage1.msg”和“MyMessage2.msg”的自定义消息,
#并且这些消息依赖于std_msgs 和 sensor_msgs;
#srv目录下包含一个名为“MyService.srv”的自定义服务;
#想要构建一个使用这些消息和服务的可执行文件message_program,
#和一个不使用这些消息和服务的可执行文件dos_not_use_local_messages_program,
#则需要在 CMakeLists.txt 中包含以下内容:

#---------
# Get the information about this package's buildtime dependencies
  find_package(catkin REQUIRED
    COMPONENTS message_generation std_msgs sensor_msgs)

  # Declare the message files to be built
  add_message_files(FILES
    MyMessage1.msg
    MyMessage2.msg
  )

  # Declare the service files to be built
  add_service_files(FILES
    MyService.srv
  )

  # Actually generate the language-specific message and service files
  generate_messages(DEPENDENCIES std_msgs sensor_msgs)

  # Declare that this catkin package's runtime dependencies
  catkin_package(
   CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
  )

  # define executable using MyMessage1 etc.
  add_executable(message_program src/main.cpp)
  add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

  # define executable not using any messages/services provided by this package
  add_executable(does_not_use_local_messages_program src/main.cpp)
  add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})
#------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMakeLists.txtROS中用于构建和编译软件包的文件。下面是一个简单的CMakeLists.txt示例,它包含了一些常用的指令和变量: ``` cmake_minimum_required(VERSION 2.8.3) project(my_package) find_package(catkin REQUIRED COMPONENTS roscpp std_msgs ) catkin_package( INCLUDE_DIRS include LIBRARIES my_package CATKIN_DEPENDS roscpp std_msgs ) include_directories( include ${catkin_INCLUDE_DIRS} ) add_library(my_library src/my_library.cpp) target_link_libraries(my_library ${catkin_LIBRARIES}) add_executable(my_node src/my_node.cpp) target_link_libraries(my_node my_library ${catkin_LIBRARIES}) ``` 其中,指令和变量的含义如下: - `cmake_minimum_required(VERSION 2.8.3)`:指定CMake的最低版本要求。 - `project(my_package)`:指定工程名称。 - `find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)`:查找必要的ROS组件。 - `catkin_package()`:声明catkin软件包,以便其他软件包可以查找到。 - `include_directories(include ${catkin_INCLUDE_DIRS})`:指定包含文件的目录。 - `add_library(my_library src/my_library.cpp)`:将my_library.cpp编译成库。 - `target_link_libraries(my_library ${catkin_LIBRARIES})`:链接库到ROS依赖库。 - `add_executable(my_node src/my_node.cpp)`:将my_node.cpp编译成可执行文件。 - `target_link_libraries(my_node my_library ${catkin_LIBRARIES})`:链接可执行文件到库和ROS依赖库。 以上是一个最基本的CMakeLists.txt示例,你可以根据你的需要修改它。更多关于CMakeLists.txt的信息,请查看ROS官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值