ROS学习(六):CMakeLists.txt 文件
CMakeLists.txt 文件
為 CMake build 文件。是 CMake 編譯系統中軟件包的輸入。描述如何編譯代碼、安裝到哪里。
http://wiki.ros.org/catkin/CMakeLists.txt
CMakeLists.txt 格式:
1、Required CMake Version (cmake_minimum_required) 2、Package Name (project()) 3、Find other CMake/Catkin packages needed for build (find_package()) 4、Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files()) 5、Invoke message/service/action generation (generate_messages()) 6、Specify package build info export (catkin_package()) 7、Libraries/Executables to build (add_library()/add_executable()/target_link_libraries()) 8、Tests to build (catkin_add_gtest()) 9、Install rules (install())1、CMake Version:
每一個 catkin CMakeLists.txt 必須以 CMake 需要的版本開始,Catkin 需要版本 2.8.3 或者更高
2、Package name:
CMake project function 指定的文件名。
在 CMake script 文件中,引用 CMake package 可以使用變量 ${PROJECT_NAME}
3、依賴功能包:
尋找需要用到的其他 CMake packages,用函數 find_package。
至少依賴一個關于 catkin 的功能包
如果要使用 C++ 和 Boost,則需要引用 find_package 包含 Boost,并且指明 Boost 的類型,如使用 Boost threads,則:
find_package(Boost REQUIRED COMPONENTS thread)4、catkin_package()
catkin_package() 是 catkin 支持的 CMake 宏指令。用來向編譯系統指明 catkin-specific 的信息,而編譯系統來生成 pkg-config and CMake files。
該函數必須用在用 add_library() or add_executable() 聲明之前。
有5個可選參數:
例子:
catkin_package(INCLUDE_DIRS includeLIBRARIES ${PROJECT_NAME}CATKIN_DEPENDS roscpp nodeletDEPENDS eigen opencv)5、Specifying Build Targets
目標文件有兩種:
1)、EXE 文件
2)、庫文件
目標命名:
注意:必須唯一
重命名用 set_target_properties() 函數,在編譯和安裝輸出中,把目標文件名 rviz_image_view 改為 image_view 如下:
自定義輸出路徑:
目標文件的默認路徑有時候必須改為自定義的路徑。自定義的路徑中,有一些默認的規則。如包含 Python bindings 的庫文件必須將路徑設置為 Python 的可 importable 文件夾。
set_target_properties(python_module_libraryPROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})Include Paths and Library Paths
Include Paths - 頭文件路徑 Library Paths - 庫文件路徑 include_directories(<dir1>, <dir2>, ..., <dirN>) link_directories(<dir1>, <dir2>, ..., <dirN>)include_directories() 的參數形如 *_INCLUDE_DIRS,變量為 find_package 路徑和其他需要包含的路徑。例如,使用 catkin and Boost ,形式如下
include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})link_directories() 用來加載外加的庫函數路徑。 catkin and CMake packages 是 find_packaged 時會自動加載鏈接信息。
link_directories(~/my_libs)Executable Targets
將 src/main.cpp src/some_file.cpp src/another_file.cpp 編譯為文件 myProgram :
Library Targets
添加默認共享庫
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})target_link_libraries
用在 add_executable() 之后
6)、Messages, Services, and Action Targets
處理 messages, services, and actions 的宏有三個:
add_message_files add_service_files add_action_files這些宏的后面必須有調用生成的宏
generate_messages()這些宏必須在 catkin_package() 之前使用:
find_package(catkin REQUIRED COMPONENTS ...)add_message_files(...)add_service_files(...)add_action_files(...)generate_messages(...)catkin_package(...)...必須為 CATKIN_DEPENDS 添加依賴項 message_runtime :
catkin_package(...CATKIN_DEPENDS message_runtime ......)必須 find_package 文功能包 message_generation,單獨或者作為 catkin 的組件。
find_package(catkin REQUIRED COMPONENTS message_generation)另外,package.xml 需包含 build dependency on message_generation 和 runtime dependency on message_runtime。
如果目標文件包含其他目標文件,而這些目標文件需要 messages/services/actions 進行編譯,則需添加
add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
some_target 是用 add_executable() 添加的目標的名字
如果你的功能包編譯 messages and/or services as well as executables 時需要用到這些宏,則
add_dependencies(some_target {{PROJECT_NAME}_EXPORTED_TARGETS})
some_target 是用 add_executable() 添加的目標的名字
如果你的功能包同時滿足上述條件,則
add_dependencies(some_target $PROJECTNAMEEXPORTEDTARGETS{catkin_EXPORTED_TARGETS})
例子:
msg:”MyMessage1.msg” and “MyMessage2.msg”
depend: std_msgs and sensor_msgs
srv: “MyService.srv”
如果,編譯 actionlib actions,需添加 actionlib_msgs 到 find_packaged 的關于 catkin 的組件中,并在 generate_messages(…) 之前添加如下代碼:
add_action_files(FILESMyAction.action )7)、Unit Tests
catkin_add_gtest(myUnitTest test/utest.cpp)
8)、可選項:Installable Targets
CMake install() 函數參數
TARGETS - which targets to install ARCHIVE DESTINATION - Static libraries and DLL (Windows) .lib stubs LIBRARY DESTINATION - Non-DLL shared libraries and modules RUNTIME DESTINATION - Executable targets and DLL (Windows) style shared libraries例子:
install(TARGETS ${PROJECT_NAME}ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )python包必須被安裝到能夠被引用的路徑
install(TARGETS python_module_libraryARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION} )安裝 Python Executable Scripts
catkin_install_python(PROGRAMS scripts/myscriptDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})安裝頭文件
install(DIRECTORY include/${PROJECT_NAME}/DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}PATTERN ".svn" EXCLUDE ) install(DIRECTORY include/DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}PATTERN ".svn" EXCLUDE )安裝 roslaunch Files or Other Resources
install(DIRECTORY launch/DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launchPATTERN ".svn" EXCLUDE) # install moveit plugin description file install(FILES robot_moveit_plugins.xmlDESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}總結
以上是生活随笔為你收集整理的ROS学习(六):CMakeLists.txt 文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS学习(五):package.xml
- 下一篇: 所有的经历都是财富 --致我的2016