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}的下一行即可。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐