最近在学习cmake,在完整看了《cmake实践》一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了。因此找了usb_cam软件包的CMakeLists.txt来进一步学习,在看懂这个例子以后,准备写篇博客记录一下,如有谬误还望指正。html
<br />node
如今市面上最多见的仍是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
经过下图来查看整个下载操做流程:ide
下面来查看usb_cam源码介绍:学习
下载好源码后,<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