1.contains a package but "catkin_make" must be invoked in the root of workspace
contains a package but "catkin_make" must be invoked in the root of workspace错误提示的字面意思是当前包含了一个package,但是catking_make命令必须在工作空间的顶级目录下执行。
先说下我是怎么出现这个问题的吧。我在创建了一个catkin_ws目录之后,在这个目录里边直接使用命令catkin_create_pkg命令创建了个maker子目录,然后进入marker里边添加了CMakeLists.txt并进行编辑,同时在marker下还创建了src子目录,并在src下写了test_marker.cpp文件。然后在marker这一级目录下进行编译的,编译报了上面的错误。
当仔细看了日志提醒后,我觉得我把workspace和package这两个ROS当中很重要的概念混了。而且这里日志提醒必须在workspace的root下编译,这样catkin_make命令才会有用。
一个workspace下面可以有多个package,但是workspace有自己组织package的方式。每一个package都是workspace当中的代码包,应该存放在src下面。那么,组织结构如下所示:
|---workspace
| |---src
| |---package_1
| |---CMakeLists.txt
| |---src
| |---xxx.cpp
|---package_2
...
|
| |---package_n
这样组织工程后,在workspace下直接使用catkin_make命令编译就ok了。
编译完成后,会创建中间文件build和devel,生成的可执行文件就在devel下面。此时工程目录大致如下:
|---workspace
| |---build
| |---devel
| |---src
| |---package_1
| |---CMakeLists.txt
| |---src
| |---xxx.cpp
|---package_2
...
|
| |---package_n
2.fatal error: ros/ros.h: No such file or directory
fatal error: ros/ros.h: No such file or directory错误提示我们没有该文件或者目录,那意思就是说我们没有引用对应的文件或者目录。
问题原因:在CMakeLists.txt当中没有把下面这一项打开
include_directories(
include
${catkin_INCLUDE_DIRS}
)
这里的include_directories是可以指定包含目录的选项。设定为${catkin_INCLUDE_DIRS},这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额外的include目录时,写在${catkin_INCLUDE_DIRS}的下一行即可。