cmake教程(四)ROS中的catkin_make

使用catkin_make编译时,有时编译内容太长,而错误在终端的上面,使用滑条仍有可能看不到。这时可以使用catkin_make > path/file.log将编译内容输出到某个文件,这样就容易查看了。 catkin本身不会存储编译过程的日志

catkin_package()

这个函数十分重要,观察CMakeLists就可以发现,它是唯一的非cmake函数,显然ROS的catkin_make就是靠它了,它的作用是指定功能包构建信息导出,在使用add_library()或者add_executable() 之前,必须调用此函数。

该函数有5个可选参数:

1
2
3
4
5
6
7
8
9
INCLUDE_DIRS  导出包含功能包的路径(即cflags)

LIBRARIES 项目中导出的库

CATKIN_DEPENDS 该项目所依赖的其他catkin项目

DEPENDS 此项目依赖的非catkin CMake项目

CFG_EXTRAS 其他配置选项

比如:
1
2
3
4
5
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv)

这表示功能包文件夹中的“include”文件夹是导出头文件所在的位置。roscpp+nodelet是构建/运行此功能包需要存在的功能包,eigen+opencv是构建/运行此功能包时需要存在的系统依赖性。

catkin_package在/opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake文件中定义。develbuild文件夹内的内容基本都是由其生成的。

这个函数解析package.xml文件,提取出里面的参数,执行catkin_make时,会在workspace/devel/share里生成pkgConfig.cmake文件的,在cmake文件中find_package就会用到这些文件,这样其他的对这个软件包有依赖的程序就可以方便的使用了。

比如现在有sub这个包,编译之后会在devel/share/sub/cmake生成两个文件:pubConfig.cmakepubConfig-version.cmake,然后到另一个包pub的CMakeLists里调用sub:find_package(sub),这样编译pub就通过了.假如把那两个文件删掉,然后使用catkin_make --pkg pub编译,就会报错:

对于build文件夹,生成是一些编译中的中间文件,比如用来存储一些环境变量之类的文件。这个文件夹意义不大。

在工程中显示其他源文件

新建CMake工程后,只有main.cpp,向目录添加文件foo.h和foo.cpp,但是它们不会在工程目录里显示,编辑CMakeLists如下

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 2.8)

project(testStream)

include_directories(.)

# 或者add_library(Foo "foo.cpp")
add_executable(${PROJECT_NAME} "main.cpp" "foo.cpp")

然后执行cmake后就会显示

报错Policy CMP0046 is not set

Policy CMP0046 is not set
可以不用管,也可以按提示修改,最好先安装:sudo apt-get install libproj-dev

参考:Policy CMP0046问题