1. 程式人生 > >ROS學習(六):CMakeLists.txt 檔案

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())
4Message/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()) 9Install 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 $PROJECTNAMEEXPORTEDTARGETS{catkin_EXPORTED_TARGETS})

例子:

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}