使用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
9INCLUDE_DIRS 导出包含功能包的路径(即cflags)
LIBRARIES 项目中导出的库
CATKIN_DEPENDS 该项目所依赖的其他catkin项目
DEPENDS 此项目依赖的非catkin CMake项目
CFG_EXTRAS 其他配置选项
比如:1
2
3
4
5catkin_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
文件中定义。devel
和build
文件夹内的内容基本都是由其生成的。
这个函数解析package.xml文件,提取出里面的参数,执行catkin_make
时,会在workspace/devel/share
里生成pkgConfig.cmake文件的,在cmake文件中find_package
就会用到这些文件,这样其他的对这个软件包有依赖的程序就可以方便的使用了。
比如现在有sub这个包,编译之后会在devel/share/sub/cmake
生成两个文件:pubConfig.cmake和pubConfig-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
8cmake_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
可以不用管,也可以按提示修改,最好先安装:sudo apt-get install libproj-dev