IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 【CMake】备忘录 -> 正文阅读

[开发工具]【CMake】备忘录

前言

CMake 是“Cross platform MAKE”的缩写
  • 是一个开源的跨平台自动化建构系统,用来管理程序构建,不相依于特定编译器
  • 需要编写CMakeLists.txt文件来定制整个编译流程
  • 可以自动化编译源代码、创建库、生成可执行二进制文件等

1. CMake使用注意事项

- CMakeLists.txt文件

  • CMake 构建专用定义文件,文件名严格区分大小写
  • 工程存在多个目录,可以每个目录都放一个CMakeLists.txt文件
  • 工程存在多个目录,也可以只用一个CMakeLists.txt文件管理

-CMake指令

  1. 不区分大小写,可以全用大写,全用小写,甚至大小写混合,自己统一风格即可
    例如,以下指令是等同的:
add_executable(hello main.cpp)
ADD_EXECUTABLE(hello main.cpp)

-参数和变量

  1. 严格大小写相关。名称中只能使用字母、数字、下划线、破折号
  2. ${}来引用变量
  3. 参数之间使用空格进行间隔

2. CMake预定义变量

① 预定义变量
?PROJECT_NAME:项目名称
?PROJECT_SOURCE_DIR:工程的根目录
?CMAKE_CURRENT_SOURCE_DIR:CMakeLists.txt所在目录
?PROJECT_BINARY_DIR:可执行文件目录
?CMAKE_CURRENT_SOURCE_DIR:运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build

?CMAKE_CURRENT_LIST_LINE:当前所在的行
?CMAKE_INSTALL_PREFIX:工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,windows下默认为C:/Program Files (x86)

?CMAKE_C_FLAGS:设置C编译选项
?CMAKE_CXX_FLAGS:设置C++编译选项
?CMAKE_C_COMPILER:设置C编译器
?CMAKE_CXX_COMPILER:设置C++编译器
?CMAKE_BUILD_TYPE:build类型(Debug,Release,…)

IF (NOT CMAKE_BUILD_TYPE)

    set(CMAKE_BUILD_TYPE "Release" CACHE STRING

        "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)

ENDIF()
?CMAKE_COMMAND:也就是CMake可执行文件本身的全路径,如C:/Program Files/cmake-3.17.0-rc3-win64-x64/bin/cmake.exe ?CMAKE_GENERATOR:编译器名称,例如 MinGW Makefiles ?BUILD_SHARED_LIBS:指定编译成静态库还是动态库 如 ?set(BUILD_SHARED_LIBS ON) 默认情况下BUILD_SHARED_LIB变量打开状态为on,即默认使用add_library是创建的动态lib,值为on ? EXECUTABLE_OUTPUT_PATH:设置编译后可执行文件的目录?SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) ?LIBRARY_OUTPUT_PATH:设置生成的库文件目录 ?SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) ?CMAKE_INCLUDE_CURRENT_DIR:自动添加?CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt,set (CMAKE_INCLUDE_CURRENT_DIR ON)

② 系统信息
?CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 中的 3
?CMAKE_SYSTEM:系统名称 Windows-10.0.19042
?CMAKE_SYSTEM_VERSION:系统版本,比如 10.0.19042
?CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 AMD64


3. 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
? 如果两个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
? 循环指令

在这里插入图片描述
在这里插入图片描述


4. CMake如何查询指令?

地址
在这里插入图片描述


5. 静态库和共享库

静态库
? 原理:在编译时将源代码复制到程序中,运行时不用库文件依旧可以运行。
? 优点:运行已有代码,运行时不用再用库;无需加载库,运行更快
? 缺点:占用更多的空间和磁盘;静态库升级,需要重新编译程序

共享库(常用)
? 原理:编译时仅仅是记录用哪一个库里面的哪一个符号,不复制相关代码
? 优点:不复制代码,占用空间小;多个程序可以同时调用一个库;升级方便,无需重新编译
? 缺点:程序运行需要加载库,耗费一定时间
在这里插入图片描述


6. 如何安装库

一般安装库流程,以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:可对构建结果进行清理

7. 如何使用库?

当编译一个需要使用第三方库的软件时,我们需要知道:
? 去哪儿找头文件 .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})

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:30:06  更:2021-11-28 11:30:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/24 3:16:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计