ROS學習(六):CMakeLists.txt 檔案
CMakeLists.txt 檔案
為 CMake build 檔案。是 CMake 編譯系統中軟體包的輸入。描述如何編譯程式碼、安裝到哪裡。
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 或者更高
cmake_minimum_required(VERSION 2.8.3)
2、Package name:
CMake project function 指定的檔名。
project(robot_brain)
在 CMake script 檔案中,引用 CMake package 可以使用變數 ${PROJECT_NAME}
3、依賴功能包:
尋找需要用到的其他 CMake packages,用函式 find_package。
至少依賴一個關於 catkin 的功能包
find_package(catkin REQUIRED)
如果要使用 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個可選引數:
INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
LIBRARIES - The exported libraries from the project
CATKIN_DEPENDS - Other catkin projects that this project depends on
DEPENDS - Non-catkin CMake projects that this project depends on
CFG_EXTRAS - Additional configuration options
例子:
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv)
5、Specifying Build Targets
目標檔案有兩種:
1)、EXE 檔案
2)、庫檔案
目標命名:
注意:必須唯一
重新命名用 set_target_properties() 函式,在編譯和安裝輸出中,把目標檔名 rviz_image_view 改為 image_view 如下:
set_target_properties(rviz_image_view
PROPERTIES OUTPUT_NAME image_view
PREFIX "")
自定義輸出路徑:
目標檔案的預設路徑有時候必須改為自定義的路徑。自定義的路徑中,有一些預設的規則。如包含 Python bindings 的庫檔案必須將路徑設定為 Python 的可 importable 資料夾。
set_target_properties(python_module_library
PROPERTIES 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 :
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
Library Targets
新增預設共享庫
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})
target_link_libraries
用在 add_executable() 之後
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo) -- This links foo against libmoo.so
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
例子:
msg:”MyMessage1.msg” and “MyMessage2.msg”
depend: std_msgs and sensor_msgs
srv: “MyService.srv”
# Get the information about this package's buildtime dependencies
find_package(catkin REQUIRED
COMPONENTS message_generation std_msgs sensor_msgs)
# Declare the message files to be built
add_message_files(FILES
MyMessage1.msg
MyMessage2.msg
)
# Declare the service files to be built
add_service_files(FILES
MyService.srv
)
# Actually generate the language-specific message and service files
generate_messages(DEPENDENCIES std_msgs sensor_msgs)
# Declare that this catkin package's runtime dependencies
catkin_package(
CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
)
# define executable using MyMessage1 etc.
add_executable(message_program src/main.cpp)
add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# define executable not using any messages/services provided by this package
add_executable(does_not_use_local_messages_program src/main.cpp)
add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})
如果,編譯 actionlib actions,需新增 actionlib_msgs 到 find_packaged 的關於 catkin 的元件中,並在 generate_messages(…) 之前新增如下程式碼:
add_action_files(FILES
MyAction.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_library
ARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
)
安裝 Python Executable Scripts
catkin_install_python(PROGRAMS scripts/myscript
DESTINATION ${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}/launch
PATTERN ".svn" EXCLUDE)
# install moveit plugin description file
install(FILES robot_moveit_plugins.xml
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}