• CMake学习笔记四:usb_cam的CMakeLists解析


    最近在学习cmake,在完整看了《cmake实践》一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了。所以找了usb_cam软件包的CMakeLists.txt来进一步学习,在看懂这个例子之后,准备写篇博客记录一下,若有谬误还望指正。


    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

    1521186605257481.png

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

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

    下面来查看usb_cam源码介绍:

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

    2 源码剖析

    下载好源码后,找到CMakeFiles.txt文件,修改添加注释后的内容如下:

    #检查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 常用指令

  • 相关阅读:
    Fire
    Apple Tree
    访问艺术馆
    三角关系
    字母表
    折纸
    旅行
    单词分类

    圆桌游戏
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/10676792.html
Copyright © 2020-2023  润新知