cmake是现在主流的用于多平台C++构建系统,本文用来记录cmake的一些常用命令的索引,加上一些自己理解,理解有误的话,欢迎大家指出。

常用路径

  • CMAKE_SOURCE_DIR: 顶级cmakelists.txt的文件夹目录。
  • CMAKE_BINRAY_DIR: 对应cmake的build的目录,主要是运行时生成的文件目录。
  • CMAKE_CURRENT_SOURCE_DIR: 一般来说,一个工程会有多个cmakelists.txt文件,对应当前文件目录。
  • CMAKE_CURRENT_BINARY_DIR: 对应build里的目录。
  • CMAKE_MODULE_PATH: api(include/find_package)包含别的cmake文件时的搜索目录。
  • CMAKE_PREFIX_PATH: api(find_libray/path)包含模块时的搜索目录。
  • CMAKE_INSTALL_PREFIX: 调用install相关函数,要生成/保存的根目录路径。

常用内置变量

  • 系统:WIN32/APPLE/ANDROID
  • 方案配置:CMAKE_BUILD_TYPE(Release/Debug)
  • 编译器:MINGW/CMAKE_COMPILER_IS_GNUCXX/CMAKE_COMPILER_IS_CLANGXX
  • /MSVC(MSVC_VERSION C++平台工具集)
  • 编译器64/32:CMAKE_SIZEOF_VOID_P EQUAL 8/4

常用API

  系统API,每一个API应该说是一个库,所以具体用法自行搜索。

  • set 设置参数,包含一般/缓存/环境变量。
  • list 针对列表操作,比如针对文件列表/参数列表/编译列表的增加删除这些。
  • file 针对文件操作,如收集文件列表,读写文件等。
  • string 针对字符串的操作,如大小写,查找,正则表达式匹配等。
  • message 打印消息,可以跟踪测试修改。

  C++编译相关

  • add_compile_options:不同平台一般来说有不同的编译设置。
  • add_definitions:添加预处理器定义。
  • include_directories: 如visual studio里的,头文件搜索目录,在当前项目以及当前项目用add_subdirectory添加的项目都会应用。
  • target_link_directories:针对指定目标的link_directories。
  • link_libraries: 添加库文件路径,注意是全路径,如果是本方案的项目,直接使用项目名就行。在当前项目以及当前项目用add_subdirectory添加的项目都会应用。
  • target_link_libraries:指定目标的link_directories。
  • add_library:添加库,根据参数生成静态或是动态库。
  • add_executable:添加执行文件。
  • set_target_properties:指定项目一些具体编辑器里的属性,如生成lib/dll的目录。

  install:方案包含的项目多,每次把需要发给用户的 include/lib/dll按照指定目录格式放好,这个可以用来做这些。cmake默认会生成一个insatll项目,这个项目会执行所有install命令,比如生成的 include/lib/dll放入以CMAKE_INSTALL_PREFIX为根路径的目录。

常用操作

  A目录 CMakeLists.txt包含B目录 CMakeLists.txt

  一般有二种方式,其一存放一些共同宏,函数或是变量,放入CMAKE_MODULE_PATH指定的目录里,用include包含,其类似CMAKE_CURRENT_SOURCE_DIR指向的是执行这个函数的CMakeLists.txt,比如这里A执行B中函数,那指向A目录。其二是使用add_subdirectory,这个文件内一般会包含add_library或是add_executable,CMAKE_CURRENT_SOURCE_DIR针对的是当前这个文件目录,如上就是B所在目录,B这种文件一般放在方案下的每个项目内。

  引入第三方库

  find_package(LibaryName)根据对应CMAKE_MODULE_PATH找到对应的Find<LibaryName>.cmake,一般来说,有如下三下变量(你也可以定义成别的名字)。

  • <LibaryName>_FOUND 是否找到库
  • <LibaryName>_INCLUDE_DIR <LibaryName>_INCLUDES 库头文件目录
  • <LibaryName>_LIBRARY <LibaryName>_LIBRARIES 库链接文件路径

  如果我们引用的第三方库没有提供Find<LibaryName>.cmake,我们可以自己写,只需要填充上面上面变量,就可以使用find_package,实际一般用如下几个函数确定这三个变量,而这几个函数默认都会去CMAKE_PREFIX_PATH查找:

  • FIND_PACKAGE_HANDLE_STANDARD_ARGS:<LibaryName>_FOUND
  • find_path:获得<LibaryName>_INCLUDE_DIR目录。
  • find_library:获得<LibaryName>_LIBRARY 目录。

  结合前面的include_directories/link_libraries引用对应的<LibaryName>_INCLUDE_DIR/<LibaryName>_INCLUDE_DIR就引入第三方库了。

  配置选项

  option/cmake_dependent_option:给定用户选项,如是否使用某个第三库这些,是否使用某些组件等。

  configure_file:把如上选项结合配置模板生成配置文件C++头文件,使C++项目能拿到用户的配置。

  这样CMake变量与配置C++的头文件以及根据变量设置的预处理器定义对应上。

  运行Python脚本

  一般工程会在编译前或后执行一些脚本或是下载,一般配合python脚本语言使用。

  find_package(PythonInterp 3 REQUIRED)

  add_custom_command 使用 ${PYTHON_EXECUTABLE} 执行对应脚本并传入相应参数,完成如下载资源或是执行glsl/hlsl转spv等逻辑。

CMake 常用命令的更多相关文章

  1. CMake学习笔记四-CMake常用命令

    CMake常用命令 PROJECT PROJECT(projectname [CXX] [C] [Java]) 指定工程名称,并可指定工程支持的语言.支持语言列表可忽略,默认支持所有语言 SET ...

  2. cmake常用命令总结

    最近研究了下cmake,总结了一些常用命令,方便以后快速查找. project(projectname [CXX] [C] [Java]): 设置工程名. set(VAR [VALUE] [CACHE ...

  3. cmake 常用变量和常用环境变量查表手册---整理 .

    一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种 ...

  4. cmake 常用变量和常用环境变量查表手册

    cmake 常用变量和常用环境变量查表手册 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定 ...

  5. cmake常用工程示例大集合

    1 简单的可执行文件生成工程 1.1 源文件   main.cpp #include <stdio.h> int main(int argc, char *argv[]) { printf ...

  6. ROS 的一些常用命令行功能

    1.安装并添加源sudo gedit /etc/apt/sources.list更新下sudo apt-get update添加 sources.list,如sudo sh -c '. /etc/ls ...

  7. Ubuntu常用命令及git常用命令

    1. CMakeLists.txt中指定OpenCV路径 set(OPENCV_DIR /***/***/opencv-2.4.9) 2. cmake工程编译安装 mkdir build cd bui ...

  8. Linux 常用命令(持续补充)

    常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...

  9. LVM基本介绍与常用命令

    一.LVM介绍LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制LVM - 优点:LVM通常用于装备大量磁盘的系统,但它同样适 ...

随机推荐

  1. 四则运算生成命令行程序 (Python)

    Github项目地址:Github Pages 结对项目成员:张鹏 3118004985 郑靓 3118004988 一.项目需求分析 二.功能实现 三.代码实现or功能说明 ★ GUI功能扩展说明 ...

  2. Java数据结构——图的基本理论及简单实现

    1. 图的定义图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的:其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边 ...

  3. java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  4. Apache Hudi 0.6.0版本重磅发布

    1. 下载信息 源码:Apache Hudi 0.6.0 Source Release (asc, sha512) 二进制Jar包:nexus 2. 迁移指南 如果您从0.5.3以前的版本迁移至0.6 ...

  5. JavaScript面向对象的学习

    1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...

  6. csp201909-2小明种苹果续

    /* 定义输入N 二维数组 输出T总数 D掉落棵树 E掉落组数 定义last记录上次掉落的编号,flag=1表示两次连续掉落,不掉落归零 spec=1表示1 2都掉落了,spec=2表示只有1掉落 对 ...

  7. ajax请求默认都是异步请求,怎么变为同步请求

    Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({   url: "some.PHP",   as ...

  8. 如何成为一位合格的ScrumMaster

    嗨,大家好,我是叶子 ScrumMaster的职责简单理解为:确保团队按照scrum的方式运行,团队的教练,帮助团队更好的工作,过程中的执行者,能够在team和po之间平衡.移除项目进度的障碍,保护团 ...

  9. oa项目面试准备

    熟悉项目在ssm框架下的编程流程,了解mysql html spring springmvc mybatis技术.了解过springboot编程. 在上个寒假跟着培训机构用springboot框架编写 ...

  10. Codeforece E. Anton and Permutation

    主席树算贡献l,r中交换位置,算出>=rank(h) 和 <=rank(h) a[l],a[r] 先不统计 a[l]比a[r]大的话交换后ans-1,a[l]比a[r]小的话交换后ans- ...