参考文章:ROS中的CMakeLists.txt
CMakeLists.txt主要包括下面几个部分
Required CMake Version(cmake_minimum_required
)
Package Name(project()
)
Find other CMake/Catkinpackages needed for build (find_package()
)
Message/Service/ActionGenerators(add_message_files(), add_service_files(), add_action_files()
)
Invokemessage/service/action generation(generate_messages()
)
Specify package buildinfo export (catkin_package()
)
Libraries/Executablesto build(add_library()/add_executable()/target_link_libraries()
)
Tests to build(catkin_add_gtest()
)
Install rules(install()
)
catkinCMakeLists.txt都要以此开始,catkin编译需要2.8.3版本以上的cmake。
通过project()这个函数指定包的名字,在CMake中指定后,你可在其他地方通过使用变量${PROJECT_NAME}
来引用它
在这里点题:自定义的ROS功能包怎么添加依赖?
搜索find_package
加入依赖的功能包
参考(ROS-5)功能包之间的互相调用
这里指明构建这个package需要依赖的package,我们使用catkin_make的编译方式,至少需要catkin这个包。
find_package(catkin REQUIRED)
会产生环境变量catkin_INCLUDE_DIRS
同理,find_package(roscpp REQUIRED)
会产生环境变量roscpp_INCLUDE_DIRS
因此,如果是写成:
find_package(roscpp REQUIRED)
find_package(rospy REQUIRED)
find_package(std_msgs REQUIRED)
将会产生3个环境变量,而如果写成下面这样,就只产生一个环境变量catkin_INCLUDE_DIRS
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
注意
这里提到的环境变量catkin_INCLUDE_DIRS
,在CMakeList.txt中将会被include_directories
加入
include_directories(
include
${catkin_INCLUDE_DIRS}
)
当我们自定义message/service/action时:(ROS-4)通信demo
需要使用add_message_files, add_service_files,add_action_files
来导入相应的文件.msg .srv .action
接着使用generate_messages
来将这些文件转化为cpp
或py
文件
最后是使用catkin_package
产生pkg-config和CMake文件,必须要依赖message_runtime
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
总体流程
find_package(...)
add_message_files(...)
add_service_files(...)
add_action_files(...)
generate_messages(...)
catkin_package(...)
我们要确保msg文件被转换成为C++,Python和其他语言的源代码:
确保package.xml它包含两条语句:
这是一个catkin提供的cmake宏,当我们要给构建系统指定catkin的特定的信息时就需要了,或者反过来利用他产生pkg-config和CMake文件。
这个函数必须在声明add_library()
或者 add_executable()
生成target之前使用。
编译产生的target有多种形式,通常有两种:程序可以运行的可执行文件以及在可执行文件编译和运行时要用到的库。
target的命名很重要,在catkin中target的名字必须是唯一的,和你之前构建产生的和安装的都不能相同。这只是cmake内部的需要。可以利用set_target_properties()
函数将以个target进行重命名。例如:
set_target_properties(rviz_image_view
PROPERTIES OUTPUT_NAME image_view
PREFIX "")
rviz_image_view
改为image_view
ROS中的输出路径时默认的,但是也可通过下面进行修改:
set_target_properties(python_module_library
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})
在我们指定target之前,我们需要指明对target而言,在哪里找源文件,特别是在哪里找头文件,在哪里找库文件。
Include Paths:指明编译代码时在哪里寻找头文件;
Library Paths:指明可执行文件需要的库文件在哪里。
函数:include_directories
的参数是通过find_package
产生的*_INCLUDE_DIRS
变量和其他所有额外的头文件路径。例如:
include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
这里"include"表示你的pacakge里面的include这个路径也包含在里面。可注意上文的1.3小节。
link_directories():这个函数用来添加额外的库的路径,然而,这并不鼓励使用,因为所有的catkin和cmake的package在使用find_package时就已经自动的有他们的链接信息。简单的连接可以通过target_link_libraries()来进行。
例如:
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
add_library()
用来指定编译输出的库。默认的catkin编译产生共享库:
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})
使用target_link_libraries
函数来指定可执行文件链接的库
。这个要用在add_executable()
后面。
形如:
target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)
比如:
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)
这就是生成可执行文件foo
,生成共享库moo
,再将可执行文件foo
链接到库文件libmoo.so
<package format="2">
<name>foo_corename>
<version>1.2.4version>
<description>
This package provides foo capability.
description>
<maintainer email="[email protected]">Ivana Bildbotzmaintainer>
<license>BSDlicense>
<url>http://ros.org/wiki/foo_coreurl>
<author>Ivana Bildbotzauthor>
<buildtool_depend>catkinbuildtool_depend>
<depend>roscppdepend>
<depend>std_msgsdepend>
<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
<exec_depend>rospyexec_depend>
<test_depend>python-mocktest_depend>
<doc_depend>doxygendoc_depend>
package>
在这里点题:自定义的ROS功能包怎么添加依赖?
找到depend
,添加依赖即可
<depend>std_msgsdepend>