CMake學習筆記四:usb_cam的CMakeLists解析

最近在學習cmake,在完整看了《cmake實踐》一書後,跟着書上例程敲了跑了一遍,也寫了幾篇相關讀書筆記,算是勉強基本入門了。因此找了usb_cam軟件包的CMakeLists.txt來進一步學習,在看懂這個例子以後,準備寫篇博客記錄一下,如有謬誤還望指正。html

<br />node

1 usb_cam軟件包簡介

如今市面上最多見的仍是USB攝像頭,物美價廉,要想使USB攝像頭在ROS下正常工做,咱們就須要一個軟件包來支持,如今ROS下最經常使用的usb攝像頭軟件包就是usb_cam,簡單理解該軟件包就是V4L(Video for Linux)USB攝像頭驅動在ROS在的一個移植版本。linux

下面咱們在github上來下載該源碼,github上的usb_cam源碼網址以下:git

https://github.com/ros-drivers/usb_camgithub

1521186605257481.png

經過下圖來查看整個下載操做流程:ide

Screenshot from 2018-03-16 16:01:37.png

下面來查看usb_cam源碼介紹:學習

Screenshot from 2018-03-16 16:18:28.png

2 源碼剖析

下載好源碼後,<span style="color:red">找到CMakeFiles.txt文件,修改添加註釋後的內容以下:</span>ui

#檢查cmake的版本,要求至少爲2.8.3
cmake_minimum_required(VERSION 2.8.3)

#定義工程名爲usb_cam
project(usb_cam)

#搜索外部庫(包)catkin,並在後面列出了與 catkin包 相關的一些部件清單
find_package(catkin REQUIRED COMPONENTS image_transport roscpp std_msgs std_srvs sensor_msgs camera_info_manager)

#先搜索cmake本身的PkgConfig模塊,才能使用pkg_check_modules
find_package(PkgConfig REQUIRED)
#pkg_check_module與find_package功能基本一直,也是搜索外部庫 
pkg_check_modules(avcodec libavcodec REQUIRED)  #libavcodec庫用於讀取視頻文件
pkg_check_modules(swscale libswscale REQUIRED)  #libswscale庫用於各類圖像像素格式的轉換

#catkin_package 宏是 catkin 的宏之一,聲明要傳遞給依賴項目的內容,生成 cmake 配置文件。
catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
)

#用來向工程添加多個頭文件搜索路徑
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  ${avcodec_INCLUDE_DIRS}
  ${swscale_INCLUDE_DIRS}
)

#將指定的源文件usb_cam.cpp生成連接庫文件,而後添加到工程中去
add_library(${PROJECT_NAME} src/usb_cam.cpp)

#用來向工程usb_cam添加多個連接庫
target_link_libraries(${PROJECT_NAME} 
  ${catkin_LIBRARIES}
  ${avcodec_LIBRARIES}
  ${swscale_LIBRARIES}
)

##生成一個名爲usb_cam_node的可執行文件,其對應源文件是nodes/usb_cam_node.cpp
add_executable(${PROJECT_NAME}_node nodes/usb_cam_node.cpp)

#用來向可執行文件usb_cam_node添加多個連接庫
target_link_libraries(${PROJECT_NAME}_node 
  ${PROJECT_NAME}
  ${avcodec_LIBRARIES}
  ${swscale_LIBRARIES}
  ${catkin_LIBRARIES}
)

#可執行文件usb_cam_node安裝到CATKIN的BIN目錄下 (在可執行文件連接了外部庫後)
#靜態庫usb_cam安裝到CATKIN的LIB目錄下 (在工程連接了外部庫後)
install(TARGETS ${PROJECT_NAME}_node ${PROJECT_NAME}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
)

#在/launch目錄下安裝一個啓動文件
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  FILES_MATCHING PATTERN "*.launch"
)

#在catkin的include目錄下安裝include/usb_cam目錄下的全部內容
install(DIRECTORY include/${PROJECT_NAME}/
   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
   FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
)

具體的分析已在註釋中詳細說明了,有些不明白的指令能夠參考個人另外一篇博客 - CMake學習筆記三:cmake 經常使用指令spa

相關文章
相關標籤/搜索