---------------------------------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