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

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

下面来查看usb_cam源码介绍:

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 常用指令 。
CMake学习笔记四:usb_cam的CMakeLists解析的更多相关文章
- cmake 学习笔记(四)
接前面的一二三,学习一下 CMakeCache.txt 相关的东西. CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数). ...
- CMake学习笔记四-CMake常用命令
CMake常用命令 PROJECT PROJECT(projectname [CXX] [C] [Java]) 指定工程名称,并可指定工程支持的语言.支持语言列表可忽略,默认支持所有语言 SET ...
- cmake学习笔记(五)
在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...
- cmake 学习笔记(二)
在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...
- cmake 学习笔记(三) (转)
接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-576习题解析 为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是: 1. ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-573习题解析 为便于查阅,这里整理并列出了我前面播客中的关于70-573习题解析系列的所有问题,有些内容可能会在以后更新, ...
随机推荐
- how to read openstack code: request extension
We have learned resource extension and action extension. This post we will write a request extension ...
- 基于 HTML5 WebGL 的挖掘机 3D 可视化应用
前言 在工业互联网以及物联网的影响下,人们对于机械的管理,机械的可视化,机械的操作可视化提出了更高的要求.如何在一个系统中完整的显示机械的运行情况,机械的运行轨迹,或者机械的机械动作显得尤为的重要,因 ...
- 【Todo】STAR面试法
今天在面试培训的时候,接触到了STAR面试法. 觉得挺好的,用来准备非技术面试,还蛮全面的.所以可以多了解一下. 可以参考:http://www.hrloo.com/rz/73652.html
- Asp.net MVC 简单分页 自做简单分页
Asp.net MVC 简单分页: public static string Pager(int page,int pageSize,int total) { ...
- Python的字符串和列表和字典的方法/函数
字符串 S.find()#可指定范围查找字串,返回索引值,否则返回-1 S.index()#同find,只是找不到的之后返回异常 S.count()#返回找到字串的个数 S.lower()#转小写 S ...
- Android开发文档翻译之-Services
Service是一种能长期在后台运行同一时候不须要与用户进行交互的应用组件.其它组件能够开启service,开启后service能够自行运行及时用户已经切换到其它的应用.此外,组件能够与service ...
- 【iOS系列】-UITableView的使用
UITableView的使用: 第一:数据展示条件 1,UITableView的所有数据都是由数据源(dataSource)提供,所以想在UITableView展示数据,必须设置UITableview ...
- 汉诺塔算法c++源代码(递归与非递归)[转]
算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...
- Entity FramWork Code first 使用心得
1 最有用的命令 update-database -force -verbose 2 主键如果不是默认的int或者 bigint而是guid 或者 string类型,创建记录的时候要给主键赋值 3 在 ...
- get the page name from url
https://stackoverflow.com/questions/1874532/better-way-to-get-page-name The way I interpret the ques ...