目录

1、什么是CMake

2 CMake有什么优缺点?

3、CMake 到底多好用?

CMake 配置方法

4、CMake使用注意事项

5、CMake常用指令介绍

CMake如何查询指令?

6、 静态库和共享库

静态库

共享库(常用)

7、如何安装库?

8、 如何使用库?


1、什么是CMake

CMake 是"Cross platform MAke"的缩写

• 一个开源的跨平台自动化建构系统,用来管理程序构建,不相依于特定编译器

• 需要编写CMakeList.txt 文件来定制整个编译流程(需要一定学习时间)

• 可以自动化编译源代码、创建库、生成可执行二进制文件等

• 为开发者节省大量时间,工程实践必备 Write once, run everywhere CMake 不再使你在构建项目时郁闷地想自杀了 -- 一位开发者 学习资料:官网:www.cmake.org 、《CMake practice》 、《learning CMake》

2 CMake有什么优缺点?

优点:

• 开源,使用类 BSD 许可发布

• 跨平台使用,根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix的Makefile 或Windows 的 Visual Studio 工程

• 能够管理大型项目,比如OpenCV、Caffe、MySql Server • 自动化构建编译,CMake 构建项目效率非常高

注意:

• 需要根据CMake 专用语言和语法来自己编写CMakeLists.txt 文件 • Cmake 支持很多语言: C、C++、Java 等

• 如项目已经有非常完备的工程管理工具,并且不存在维护问题,没必要迁移到CMake 10.3 CMake如何安装? Windows下:按提示无脑安装 Linux下

• apt 安装【推荐,够用】 但是Ubuntu源里版本可能比较低

sudo apt-get install cmake
sudo apt-get install cmake-gui

源码编译【需要最新版本时】 , 解压后执行

./bootstrap
make –j2
sudo make install
cmake --version

3、CMake 到底多好用?

举个栗子:OpenCV 在Windows下的配置方法 毛星云的博客里OpenCV配置方法

• 需要手动添加环境变量、 项目中手动添加包含路径、项目中手动添加库路径、项目中手动添加链接库 名、Debug 和Release下配置不同、 和OpenCV版本相关、构建好的项目不能直接移植到其他平台,给 别人用代码成本也太高 太繁琐!问题多,易出错!刚开始就想放弃了!

CMake 配置方法

• CMake 一键配置、以上所有东西自动关联,并且和OpenCV版本无关、跨平台移植,效率高 无脑安装!超简单!用过的都说好!学习劲头更足了!

4、CMake使用注意事项

CMakeLists.txt文件 • CMake 构建专用定义文件,文件名严格区分大小写

• 工程存在多个目录,可以每个目录都放一个CMakeLists.txt文件

• 工程存在多个目录,也可以只用一个CMakeLists.txt文件管理 CMake指令

• 不区分大小写,可以全用大写,全用小写,甚至大小写混合,自己统一风格即可

add_executable(hello main.cpp)
ADD_EXECUTABLE(hello main.cpp)

参数和变量

• 严格大小写相关。名称中只能用字母、数字、下划线、破折号

• 用${}来引用变量

• 参数之间使用空格进行间隔

5、CMake常用指令介绍

cmake_minimum_required

• 指定要求最小的cmake版本,如果版本小于该要求,程序终止

project(test)

• 设置当前项目名称为

test CMAKE_BUILD_TYPE

Debug: 调试模式,输出调试信息,不做优化

Release: 发布模式,没有调试信息,全优化

RelWithDebInfo::类似Release, 但包括调试信息

MinSizeRel: 一种特殊的Release模式,会特别优化库的大小

CMAKE_CXX_FLAGS

• 编译CXX的设置标志,比如 –std=c++11, -Wall, -O3(优化,使用向量化、CPU流水线,cache等提高代 码速度)

• 编译过程中输出警告(warnings):set(CMAKE_CXX_FLAGS "-Wall")

• 追加,不会丢失之前的定义:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") include_directories

• 指定头文件的搜索路径,编译器查找相应头文件

• 举例:文件main.cpp中使用到路径 /usr/local/include/opencv/cv.h 中这个文件

• CMakeLists.txt 中添加 include_directories(/usr/local/include)

• 使用时main.cpp前写上 #include “opencv/cv.h" 即可 set (variable value)

• 用变量代替值

• set (SRC_LST main.cpp other.cpp) 表示定义SRC_LST代替后面的两个cpp文件 add_executable(hello main.cpp)

• 用指定的源文件为工程添加可执行文件

• 工程会用main.cpp生成一个文件名为 hello 的可执行文件 add_library(libname STATIC/SHARED sources)

• 将指定的源文件生成链接库文件。STATIC 为静态链接库,SHARED 为共享链接库 target_link_libraries (target library1 library2 ...)

• 为库或二进制可执行文件添加库链接,要用在add_executable之后。

• 例子如下:

• target_link_libraries (myProject libhello.a) add_dependencies (target-name depend)

• 为上层target添加依赖,一般不用

• 若只有一个targets有依赖关系,一般选择使用 target_link_libraries Debug: 调试模式,输出调试信息,不做优化 Release: 发布模式,没有调试信息,全优化 RelWithDebInfo::类似Release, 但包括调试信息 MinSizeRel: 一种特殊的Release模式,会特别优化库的大小

• 如果两个targets有依赖关系,并且依赖库也是通过编译源码产生的。这时候用该指令可以在编译上层 target时,自动检查下层依赖库是否已经生成

add_subdirectory(source_dir)

• 向当前工程添加存放源文件的子目录,目录可以是绝对路径或相对路径

aux_source_directory( dir varname)

• 在目录下查找所有源文件

message(mode "message text" )

• 打印输出信息,mode包括FATAL_ERROR、WARNING、STATUS、DEBUG等

• message(STATUS “Set debug mode")

一些预定义好的指令

PROJECT_NAME:项目名称,与project( xxx) 一致

PROJECT_SOURCE_DIR:即内含 project() 指令的 CMakeLists 所在的文件夹

EXECUTABLE_OUTPUT_PATH:可执行文件输出路径

LIBRARY_OUTPUT_PATH :库文件输出路径

CMAKE_BINARY_DIR:默认是build文件夹所在的绝对路径

CMAKE_SOURCE_DIR:源文件所在的绝对路径

find_package(package version EXACT/QUIET/REQUIRED)

• 功能:采用两种模式( FindXXX.cmake和XXXConfig.cmake )搜索外部库

• 示例:find_package( OpenCV 3.4 REQUIRED )

• version:指定查找库的版本号。EXACT:要求该版本号必须精确匹配。QUIET:禁掉没有找到时的警 告信息。REQUIRED选项表示如果包没有找到的话,CMake的过程会终止,并输出警告信息。

• 搜索有两种模式:

• Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到 XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由 FindXXX.cmake模块完成。

• Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件从而找到XXX库。其中具体查找库并给 XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。

• 两种模式看起来似乎差不多,不过cmake默认采取Module模式,如果Module模式未找到库,才会采 取Config模式。

• 如果XXX_DIR路径下找不到XXXConfig.cmake文件,则会找/usr/local/lib/cmake/XXX/中的 XXXConfig.cmake文件。总之,Config模式是一个备选策略。通常,库安装时会拷贝一份 XXXConfig.cmake到系统目录中,因此在没有显式指定搜索路径时也可以顺利找到。

• 若XXX安装时没有安装到系统目录,则无法自动找到XXXConfig.cmake,需要在CMakeLists.txt最前面 添加XXX的搜索路径。

• set(XXX_DIR /home/cxl/projects/OpenCV3.1/build) #添加OpenCV的搜索路径

• 当find_package找到一个库的时候,以下变量会自动初始化:

_FOUND : 显示是否找到库的标记 _INCLUDE_DIRS 或 _INCLUDES : 头文件路径 _LIBRARIES 或 _LIBRARIES 或 _LIBS : 库文件 _DEFINITIONS:

list

• 列表操作(读、搜索、修改、排序)

• 追加例子:LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)

If, elseif, endif

• 判断语句,使用和C语言一致

foreach

• 循环指令

CMake如何查询指令?

Index — CMake 3.22.0-rc2 Documentation

6、 静态库和共享库

静态库

• 原理:在编译时将源代码复制到程序中,运行时不用库文件依旧可以运行。

• 优点:运行已有代码,运行时不用再用库;无需加载库,运行更快

• 缺点:占用更多的空间和磁盘;静态库升级,需要重新编译程序

共享库(常用)

• 原理:编译时仅仅是记录用哪一个库里面的哪一个符号,不复制相关代码

• 优点:不复制代码,占用空间小;多个程序可以同时调用一个库;升级方便,无需重新编译

• 缺点:程序运行需要加载库,耗费一定时间

7、如何安装库?

一般安装库流程,以Pangolin为例:

git clone https://github.com/stevenlovegrove/Pangolin.git

cd Pangolin

mkdir build

cd build

cmake -DCMAKE_INSTALL_PREFIX=yourdirectory .. make –j4

sudo make install

• cmake ..(注意,..代表上一级目录)

• make install 默认安装位置 /usr/bin

• make clean:可对构建结果进行清理

8、 如何使用库?

当编译一个需要使用第三方库的软件时,我们需要知道:

• 去哪儿找头文件 .h

• 去哪儿找库文件 (.so/.dll/.lib/.dylib/…)

• 需要链接的库文件的名字

• 比如需要一个第三方库 curl,不使用find命令的话, CMakeLists.txt 需要指定头文件目录和库文件:

include_directiories(/usr/include/curl)

target_link_libraries(myprogram yourpath/curl.so)

• 使用cmake的Modules目录下的FindCURL.cmake,就很简单了,相应的CMakeLists.txt 文件:

find_package(CURL REQUIRED)

include_directories(${CURL_INCLUDE_DIR})

target_link_libraries(curltest ${CURL_LIBRARY})

CMake的理论与实践相关推荐

  1. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    浅读<视觉SLAM十四讲:从理论到实践>--操作1--初识SLAM 下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/s ...

  2. 视觉SLAM十四讲从理论到实践第二版源码调试笔记(理论基础1-6章)

    2019-2020-2学期机器人工程专业需要开设SLAM技术课程,使用教材为视觉SLAM十四讲从理论到实践第二版. 为方便学生学习课程知识,将Arduino.ROS1.ROS2和SLAM集成到课程定制 ...

  3. 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...

    2022年有三AI-CV夏季划已经正式发布,有三AI-CV夏季划是我们最系统最重要的深度学习和计算机视觉学习计划小组,目标是在新手入门的基础之上,彻底掌握好CV的重要方向,同时提升模型设计与优化的工程 ...

  4. 跨平台C++ Qt数据库管理系统设计与实战:从理论到实践的全面解析

    跨平台C++ Qt数据库管理系统设计与实战:从理论到实践的全面解析 一.引言(Introduction) 1.1 数据库管理系统的重要性(Importance of Database Manageme ...

  5. <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS

    <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS 前言 一.为什么需要ROS 二.ROS的总体设计 1.一个目标 2.五个特点 3.四位一体 三.ROS的系统实现--三个层次 ...

  6. ARM NEON指令集优化理论与实践

    ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...

  7. CPU消耗,跟踪定位理论与实践

    CPU消耗,跟踪定位理论与实践 一.性能指标之资源指标定位方案 1.打tprof报告方法 抓取perfpmr文件 60秒. perfpmr.sh 60 从结果文件中取出tprof.sum 或直接抓取t ...

  8. UI设计培训之如何将设计理论与实践相结合

    学习UI设计理论知识与实践技术都是要有的,很多人都不爱去听理论知识,这对以后的工作是没有任何帮助的,只有将设计理论与实践相结合才能帮助到自己,那么如何将设计理论与实践相结合?来看看本期下面的详细介绍. ...

  9. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

最新文章

  1. JavaScript 对象属性作实参以及实参对象的callee属性
  2. STL,ATL,WTL之间的联系和区别
  3. 计算机二级vb考试查分,全国计算机二级考试VB程序设计复习试题
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1091:求阶乘的和
  5. 在Map 3D显示管理器中更改当前地图的名字
  6. ie 7 beta 2出来了
  7. 霍金首次公开24岁时博士论文 把剑桥的服务器搞瘫痪了……
  8. 6416与aic23进行语言数据采集和处理的程序beta版
  9. Ubuntu系列硬盘安装
  10. 文本文件编码探测几个链接
  11. Spring 最常用的 7 大类注解,史上最强整理!
  12. 【笔记】Windows Sublime text安装json格式化插件SublimePrettyJson
  13. 关于STM32F107移植到GD32F307后,固件不断重启的一个解决方式
  14. C51单片机实验——矩阵按键
  15. NeRF 神经辐射场
  16. Java工程师通宵都要看完这几本阿里P8都强烈推荐的Java电子书
  17. HTML中<img src=““>中图片路径的用法
  18. float 范围 java_Java中float/double取值范围与精度
  19. 计算机视觉最新进展概览2021年8月15日到2021年8月21日
  20. qbo odom数据的获取

热门文章

  1. 数论——斐波那契数列
  2. 我不喜欢你了 你满意了么?伤感QQ日志
  3. 深度工作室年总结---为什么我们能拿数十项竞赛奖?
  4. 【五一专属】阿里云ECS大测评#五一专属|向所有热爱分享的“技术劳动者”致敬#
  5. Cortex-M3 PendSV 中断 系统调用 说明
  6. 使用Python获取春节档电影影评,制作可视化词云图
  7. ASP.NET 界面外观设计与布局
  8. 在没有root的手机上直接查看sqlite数据库内容
  9. Shell脚本工作原理
  10. AJAX框架眼镜穿搭夏天,设计感夏款,打造亮眼穿搭(II)