最近在学习cmake,在完整看了《cmake实践》一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了。所以找了usb_cam软件包的CMakeLists.txt来进一步学习,在看懂这个例子之后,准备写篇博客记录一下,若有谬误还望指正。
<br />1 usb_cam软件包简介
现在市面上最常见的还是USB摄像头,物美价廉,要想使USB摄像头在ROS下正常工作,我们就需要一个软件包来支持,现在ROS下最常用的usb摄像头软件包就是usb_cam,简单理解该软件包就是V4L(Video for Linux)USB摄像头驱动在ROS在的一个移植版本。
下面我们在github上来下载该源码,github上的usb_cam源码网址如下:
https://github.com/ros-drivers/usb_cam

通过下图来查看整个下载操作流程:

下面来查看usb_cam源码介绍:

2 源码剖析
下载好源码后,<span style="color:red">找到CMakeFiles.txt文件,修改添加注释后的内容如下:</span>
1#检查cmake的版本,要求至少为2.8.3 2cmake_minimum_required(VERSION 2.8.3) 3 4#定义工程名为usb_cam 5project(usb_cam) 6 7#搜索外部库(包)catkin,并在后面列出了与 catkin包 相关的一些部件清单 8find_package(catkin REQUIRED COMPONENTS image_transport roscpp std_msgs std_srvs sensor_msgs camera_info_manager) 9 10#先搜索cmake自己的PkgConfig模块,才能使用pkg_check_modules 11find_package(PkgConfig REQUIRED) 12#pkg_check_module与find_package功能基本一直,也是搜索外部库 13pkg_check_modules(avcodec libavcodec REQUIRED) #libavcodec库用于读取视频文件 14pkg_check_modules(swscale libswscale REQUIRED) #libswscale库用于各种图像像素格式的转换 15 16#catkin_package 宏是 catkin 的宏之一,声明要传递给依赖项目的内容,生成 cmake 配置文件。 17catkin_package( 18 INCLUDE_DIRS include 19 LIBRARIES ${PROJECT_NAME} 20) 21 22#用来向工程添加多个头文件搜索路径 23include_directories( 24 include 25 ${catkin_INCLUDE_DIRS} 26 ${avcodec_INCLUDE_DIRS} 27 ${swscale_INCLUDE_DIRS} 28) 29 30#将指定的源文件usb_cam.cpp生成链接库文件,然后添加到工程中去 31add_library(${PROJECT_NAME} src/usb_cam.cpp) 32 33#用来向工程usb_cam添加多个链接库 34target_link_libraries(${PROJECT_NAME} 35 ${catkin_LIBRARIES} 36 ${avcodec_LIBRARIES} 37 ${swscale_LIBRARIES} 38) 39 40##生成一个名为usb_cam_node的可执行文件,其对应源文件是nodes/usb_cam_node.cpp 41add_executable(${PROJECT_NAME}_node nodes/usb_cam_node.cpp) 42 43#用来向可执行文件usb_cam_node添加多个链接库 44target_link_libraries(${PROJECT_NAME}_node 45 ${PROJECT_NAME} 46 ${avcodec_LIBRARIES} 47 ${swscale_LIBRARIES} 48 ${catkin_LIBRARIES} 49) 50 51#可执行文件usb_cam_node安装到CATKIN的BIN目录下 (在可执行文件链接了外部库后) 52#静态库usb_cam安装到CATKIN的LIB目录下 (在工程链接了外部库后) 53install(TARGETS ${PROJECT_NAME}_node ${PROJECT_NAME} 54 RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 55 LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 56) 57 58#在/launch目录下安装一个启动文件 59install(DIRECTORY launch/ 60 DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch 61 FILES_MATCHING PATTERN "*.launch" 62) 63 64#在catkin的include目录下安装include/usb_cam目录下的所有内容 65install(DIRECTORY include/${PROJECT_NAME}/ 66 DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} 67 FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" 68)
具体的分析已在注释中详细说明了,有些不明白的指令可以参考我的另一篇博客 - CMake学习笔记三:cmake 常用指令 。