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