---------------------------------html
程序在cmake编译是这样的流程, cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译连接生成可执行文件.node
catkin_make是将cmake与make的编译方式作了一个封装的指令工具, 规范了工做路径与生成文件路径.python
CMake Variablesshell
#### Running command: "make -j4" in "/home/user/catkin_ws/build"
ubuntu
工做空间api
源空间bash
编译空间 ide
开发空间svn
安装空间 -DCMAKE_INSTALL_PREFIX=/any/directorycmake默认是/usr/local
系统安装空间 /opt/ros/ROSDISTRO
结果空间 source RESULT-SPACE/setup.sh 相似扫描安装空间与开发空间,替换系统通用下的对应文件.
catkin支持包的逐层覆盖, 当前最高,其它依据source的顺序逐层变高, 高层可覆盖低层.
ros 环境变量设置 能够参考 .bashrc文件: ros工做环境设置
catkin was designed to allow rosbuild packages to sit on top of catkin ones. This is accomplished by using overlays.
注: 咱们在系统文件夹下的 .bashrc 中加入相应的source文件, 就是为了添加ros 的环境变量等信息.
Differences in CMakeLists.txt for rosbuild and catkin
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"
恢复编译全部的包
$ catkin_make -DCATKIN_WHITELIST_PACKAGES=""
每一个包的描述文件,都须要放置在包的根目录下,对包的名字/版本/做者/维护者/依赖关系进行说明.与rosbuild中的manifest.xml类似.
依赖不正确在本地能够能够编译经过,但不能在ROS社区正确工做起来.
C++ catkin library dependencies
6种依赖标签
Build Dependencies 指出你的包编译须要依赖的包.
Build Export Dependencies 指出你的包编译导出库 (???): b依赖a的头文件,要想c只依赖b. 我认为是避免屡次依赖.
specify which packages are needed to build libraries against this package. This is the case when you transitively include their headers in public headers in this package (especially when these packages are declared as (CATKIN_)DEPENDS in catkin_package() in CMake).
Execution Dependencies 执行时依赖
Test Dependencies 单元测试
Build Tool Dependencies 编译系统工具
Documentation Tool Dependencies doc生成工具
仅须要标签: <buildtool_depends> 依赖 catkin 和 <run_depend>
对应cmakelists.txt中
========例如 universal_robot======================================
4.2 CMakeLists.txt
cmak 不会找package.xml文件, 但catkin须要. 依据cmakelists.txt文件编译须要清晰指出头文件和库文件的指向.
Finding the library
须要在package.xml中使用标签<depend> 或者<build_depend>
find_package(catkin REQUIRED COMPONENTS roscpp)
Include directories
include_directories(include ${catkin_INCLUDE_DIRS})
Exporting interfaces
须要在package.xml中使用<depend> 或者<build_export_depend>,catkin_package() 命令仅调用一次,它须要额外的参数依赖
于你的包导出的依赖.
catkin_package(CATKIN_DEPENDS angles roscpp std_msgs)
Finding the library
find_package(Boost REQUIRED)
但boost thread 运行时须要库,必须指出组件thread .
find_package(Boost REQUIRED COMPONENTS thread)
find_package()以后就能够用此编译和链接了. 命名规则基本是这样: ${name}_INCLUDE_DIRS and${name}_LIBRARIES .有时不遵循
camke社区标准命名的就请到到answers.ros.org发问.
find_package(PkgConfig REQUIRED) pkg_check_modules(GSTREAMER REQUIRED libgstreamer-0.10)
pkg_check_modules() 参数声明了一个cmake前缀,GSTREAMER_INCLUDE_DIRS 和GSTREAMER_LIBRARIES
PkgConfig 编译应用与链接的帮助工具. 用于命令行中插入正确的编译选项. (.pc文件 ) libgstreamer-0.10.pc.
Include directories
include_directories(include ${Boost_INCLUDE_DIRS} ${GSTREAMER_INCLUDE_DIRS})
若有依赖catkin 包 ,再添加 ${catkin_INCLUDE_DIRS}
Exporting interfaces
catkin_package(DEPENDS Boost GSTREAMER)
确保全部的包在package.xml被用到, <build_export_depend> 和<depend>标签.
标准命名 ${name}_INCLUDE_DIRS and${name}_LIBRARIES . catkin包通常是小写,大写(asGSTREAMER) 或混合 (likeBoost)
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GSTREAMER_INCLUDE_DIRS})
add_library(your_library libsrc1.cpp libsrc2.cpp libsrc_etc.cpp)
set(YOUR_LIB_SOURCES libsrc1.cpp libsrc2.cpp libsrc3.cpp libsrc4.cpp libsrc_etc.cpp) add_library(your_library ${YOUR_LIB_SOURCES})
target_link_libraries(your_library ${catkin_LIBRARIES})
target_link_libraries(your_library ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${GSTREAMER_LIBRARIES})
catkin_package(CATKIN_DEPENDS std_msgs DEPENDS Boost INCLUDE_DIRS include LIBRARIES your_library)
<depend>std_msgs</depend> <build_export_depend>boost</build_export_depend>
安装
install(TARGETS your_library your_other_library ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION})
install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} PATTERN ".svn" EXCLUDE)
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GSTREAMER_INCLUDE_DIRS})
add_executable(your_node src1.cpp src2.cpp src_etc.cpp)
set(${PROJECT_NAME}_SOURCES src/file1.cpp src/file2.cpp src/file3.cpp src/file4.cpp src/file5.cpp src/file6.cpp src/file_etc.cpp) add_executable(your_node ${${PROJECT_NAME}_SOURCES})
add_executable(your_node ${${PROJECT_NAME}_SOURCES}) target_link_libraries(your_node ${catkin_LIBRARIES})
add_executable(your_node ${${PROJECT_NAME}_SOURCES}) target_link_libraries(your_node ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${GSTREAMER_LIBRARIES})
ros下的安装,使得rosrun 与roslaunch可以使用.须要下面的方式安装.
install(TARGETS your_node RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
安装 cmake文件
catkin_package(CFG_EXTRAS your_macros.cmake your_modules.cmake)
install(FILES cmake/your_macros.cmake cmake/your_modules.cmake DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/cmake)
install(DIRECTORY cmake DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} PATTERN ".svn" EXCLUDE)
参考:
http://wiki.ros.org/catkin
http://wiki.ros.org/catkin/commands/catkin_make
http://wiki.ros.org/cn/ROS/Tutorials/catkin/BuildingPackages