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. centos7.8 安装部署 k8s 集群

    centos7.8 安装部署 k8s 集群 目录 centos7.8 安装部署 k8s 集群 环境说明 Docker 安装 k8s 安装准备工作 Master 节点安装 k8s 版本查看 安装 kub ...

  2. JDK14-ZGC调研初探

    原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 背景 公司ElasticSearch准备进行升级,而ElasticSearch7以上则是已 ...

  3. Vue的Options

    el:挂载点 与$mount有替换关系 new Vue({ el: "#app" }); new Vue({}).$mount('#app') 注:被你选为挂载点的那个元素,如果在 ...

  4. JavaFX桌面应用-SpringBoot + JavaFX

    SpringBoot对于Java程序员来说可以是一个福音,它让程序员在开发的时候,大大简化了各种spring的xml配置. 那么在JavaFX项目使用SpringBoot会是怎么样的体验呢? 这次使用 ...

  5. Java面试题(多线程篇)

    多线程 35.并行和并发有什么区别? 1.并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. 3.在 ...

  6. js apply() call() bind() 的使用

    bind ,call,apply 这三者都是用来改变函数的this对象的指向的. call和apply其实是同一个东西,区别只有参数不同. 其实call和apply ,只要你调用调用一个函数的时候就可 ...

  7. react 有没有类似vue中watch这样的api?

    就是 当组件里state 里的数据发生变化可以监听到这个数据的变化 当数据发生变化的时候做一些事情 比如ajax请求 ?初学react 用vue的时候会用watch 和computed 去监听数据发生 ...

  8. 3种 Springboot 全局时间格式化方式,别再写重复代码了

    本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 时间格式化在项目中使用频率是非常高的,当我们的 API 接口返回结果,需要对其中某一个 date 字段属性进行特殊的格 ...

  9. Labview学习之路(一)程序框图中的修饰

    很多小伙伴知道在前面板有很多修饰符,比如上凸框,加粗下凹框等等,但是其实在程序框图中也是有修饰符的,他的位置比较隐蔽,并且修饰符很少,所以很多人基本没有用过.现在就给大家介绍一些这些程序框图种的修饰. ...

  10. Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 给大家介绍个东西,MarkDown真的超级超级好用.哈哈.好了, 正题内容如下: 先 ...