$ cd ~/catkin_ws
$ cd src
$ catkin_init_workspace
$ cd ..
$ mkdir build
$ cd build
$ cmake ../src -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel
$ make
最先被编译的是那个在src下公用的CMakeList.txt文件,这个文件大部分内容都是在找catkin这个包的位置。最后执行一个cmake函数catkin_workspace,这个函数在/opt/ros/noetic/share/catkin/cmake/catkin_workspace.cmake文件中定义,函数对catkin_make执行时的参数进行解析,比如CATKIN_WHITELIST_PACKAGES。然后开始遍历工作空间中的文件夹,如果文件夹中有package.xml文件就将其当作一个软件包,同时对每个软件包调用add_subdirectory。add_subdirectory是cmake的一个内置函数,他会调用这个文件夹内的CMakeList.txt文件。这样就开始了每个软件包的编译,所以如果catkin_make本身出了问题就应在这个过程中去Debug。
编译后的典型工作空间结构如下:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- The 'toplevel' CMake file
package_1/
CMakeLists.txt
package.xml
...
package_n/
CATKIN_IGNORE -- Optional empty file to exclude package_n from being processed
CMakeLists.txt
package.xml
...
build/ -- BUILD SPACE
CATKIN_IGNORE -- Keeps catkin from walking this directory
devel/ -- DEVELOPMENT SPACE (set by CATKIN_DEVEL_PREFIX)
bin/
etc/
include/
lib/
share/
.catkin
env.bash
setup.bash
setup.sh
...
install/ -- INSTALL SPACE (set by CMAKE_INSTALL_PREFIX)
bin/
etc/
include/
lib/
share/
.catkin
env.bash
setup.bash
setup.sh
...
为了调试和应用方便,每个功能包可以只包含一个节点,数据服务包也可以单独作为一个包处理,当然,也可以在一个包中定义消息、服务等数据属性和类型,并同时定义若干节点。