ROS中的CMakeLists.txt

在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功。如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事。所以深入了解它是很有必要的。

我们使用cmake进行程序编译的时候,会根据CMakeLists.txt这个文件进行一步一步的处理,然后形成一个MakeFile文件,系统再通过这个文件的设置进行程序的编译。

ROS中的CMakeLists.txt主要包括以下内容

(1)Required CMake Version (cmake_minimum_required)

(2)PackageName (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_minimum_required

CMakeLists.txt都要以此开始,catkin编译需要2.8.3版本以上的cmake。

2.project()

通过project()这个函数指定包的名字,在CMake中指定后,你可在其他地方通过使用变量${PROJECT_NAME}来引用它

3.find_package()

这里指明构建这个package需要依赖的package,我们使用catkin_make的编译方式,至少需要catkin这个包。

find_package(catkin REQUIRED)

一个包被find_package,那么就会导致一些CMake变量的产生,这些变量后面将在CMake的脚本中用到,这些变量描述了所依赖的包输出的头文件、源文件、库文件在哪里。这些变量的名字依照的惯例是 < PACKAGENAME>_< PROPERTY>,比如:

< NAME>_FOUND:这个变量说明这个库是否被找到,如果找到就被设置为true,否则设为false;

< NAME>_INCLUDE_DIRS or < NAME>_INCLUDES:这个包输出的头文件目录;

< NAME>_LIBRARIES or < NAME>_LIBS:这个包输出的库文件。

需要的所有包我们都可用这种方式包含进来,比如我们需要roscpp,rospy,std_msgs。我们可以写成:

find_package(roscpp REQUIRED)

find_package(rospy REQUIRED)

find_package(std_msgs REQUIRED)

这样的话,每个依赖的package都会产生几个变量,这样很不方便。所以还有另外一种方式:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
这样,它会把所有pacakge里面的头文件和库文件等等目录加到一组变量上,比如:catkin_INCLUDE_DIRS,这样,我们就可以用这个变量查找需要的文件了。最终就只产生一组变量了。

4.Declare messages,Services and Actions

当我们需要使用.msg/.srv/.action形式的文件时,我们需要特殊的预处理器把他们转化为系统可以识别特定编程语言(.h/.cpp)。系统会用里面所有的(一些编程语言)生成器(比如gencpp,genpy,genlisp,etc)生成相应的.cpp.py文件。这就需要三个宏:add_message_files,add_service_files,add_action_files来相应的控制.msg.srv.action。这些宏后面必须跟着一个调用generate_messages()。他们的运用要注意一下几点:

1)这些宏必须在catkin_package()宏前面,即:

find_package(catkinREQUIREDCOMPONENTS…)

add_message_files(…)

add_service_files(…)

add_action_files(…)

generate_messages(…)

catkin_package(…)

2)宏catkin_package()中必须有CATKIN_DEPENDS依赖于message_runtime,即:

catkin_package(

CATKIN_DEPENDS message_runtime…

…)

3)find_package()中必须有message_generation

find_package(catkinREQUIRED COMPONENTS message_generation)

4)package.xml文件中
build_depend必须包含message_generation,
run_depend必须包含message_runtime。

5)如果你有一个包编译.msg.srv,并且可执行文件要使用他们,那么你就需要创建一个显式的依赖项,自动生成message的target。这样才能按顺序来进行编译:

add_dependencies(some_target${PROJECT_NAME}_generate_messages_cpp)

这里的some_target是add_executable()设置的target的名字。

5.catkin_package()

这是一个catkin提供的cmake宏,当我们要给构建系统指定catkin的特定的信息时就需要了,或者反过来利用他产生pkg-config和CMake文件。这个函数必须在声明add_library()或者add_executable()生成target之前使用。

catkin_package()是catkin提供的CMake宏,对生成的pkg和CMake文件进行配置,如果去掉编译也能通过,但是配置会发生变化,比如生成的可执行文件会在工作空间中的build文件夹中而不是devel/lib文件夹中,这样可能导致的一个后果是无法使用rosrun指令来运行可执行文件。

6.指定编译的target

编译产生的target有多种形式,通常有两种:程序可以运行的可执行文件以及在可执行文件编译和运行时要用到的库。

(1)target的命名:

target的命名很重要,在catkin中target的名字必须是唯一的,和你之前构建产生的和安装的都不能相同。这只是cmake内部的需要。可以利用set_target_properties()函数将这个target进行重命名。例如:

set_target_properties(rviz_image_view

PROPERTIESOUTPUT_NAMEimage_view

PREFIX”“)

这样就可将那个target rviz_image_view改为image_view。

(2)设置输出路径:

ROS中的输出路径时默认的,但是也可通过下面进行修改:

set_target_properties(python_module_library

PROPERTIESLIBRARY_OUTPUT_DIRECTORY CATKINDEVELPREFIX/ C A T K I N D E V E L P R E F I X / {CATKIN_PACKAGE_PYTHON_DESTINATION})

(3)头文件路径和库文件路径:
在我们指定target之前,我们需要指明对target而言,在哪里找源文件,特别是在哪里找头文件,在哪里找库文件。

IncludePaths:指明编译代码时在哪里寻找头文件;

LibraryPaths:指明可执行文件需要的库文件在哪里。

函数:

include_directories:他的参数是通过find_package产生的*_INCLUDE_DIRS变量和其他所有额外的头文件路径。例如:

include_directories(include BoostINCLUDEDIRS B o o s t I N C L U D E D I R S {catkin_INCLUDE_DIRS})

这里”include”表示你的pacakge里面的include这个路径也包含在里面。

link_directories():这个函数用来添加额外的库的路径,然而,这并不鼓励使用,因为所有的catkin和cmake的package在使用find_package时就已经自动的有他们的链接信息。简单的连接可以通过target_link_libraries()来进行。

(4)可执行target:

例如:
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

(5)库target:

add_library()用来指定编译产生的库。默认的catkin编译产生共享库:
add_library( PROJECTNAME P R O J E C T N A M E {${PROJECT_NAME}_SRCS})

(6)链接库:

使用target_link_libraries函数来指定可执行文件链接的库。这个要用在add_executable()后面。形如:

target_link_libraries(,,,…)

比如,将可执行文件foo链接到库文件libmoo.so。

add_executable(foo src/foo.cpp)

add_library(moo src/moo.cpp)

target_link_libraries(foo moo)

转载自:
https://blog.csdn.net/buzaishihaizi/article/details/78524929

  • 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、付费专栏及课程。

余额充值