CMake 常用命令
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 常用命令的更多相关文章
- CMake学习笔记四-CMake常用命令
CMake常用命令 PROJECT PROJECT(projectname [CXX] [C] [Java]) 指定工程名称,并可指定工程支持的语言.支持语言列表可忽略,默认支持所有语言 SET ...
- cmake常用命令总结
最近研究了下cmake,总结了一些常用命令,方便以后快速查找. project(projectname [CXX] [C] [Java]): 设置工程名. set(VAR [VALUE] [CACHE ...
- cmake 常用变量和常用环境变量查表手册---整理 .
一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种 ...
- cmake 常用变量和常用环境变量查表手册
cmake 常用变量和常用环境变量查表手册 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定 ...
- cmake常用工程示例大集合
1 简单的可执行文件生成工程 1.1 源文件 main.cpp #include <stdio.h> int main(int argc, char *argv[]) { printf ...
- ROS 的一些常用命令行功能
1.安装并添加源sudo gedit /etc/apt/sources.list更新下sudo apt-get update添加 sources.list,如sudo sh -c '. /etc/ls ...
- Ubuntu常用命令及git常用命令
1. CMakeLists.txt中指定OpenCV路径 set(OPENCV_DIR /***/***/opencv-2.4.9) 2. cmake工程编译安装 mkdir build cd bui ...
- Linux 常用命令(持续补充)
常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...
- LVM基本介绍与常用命令
一.LVM介绍LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制LVM - 优点:LVM通常用于装备大量磁盘的系统,但它同样适 ...
随机推荐
- MySQL标识列(自增长列)
#标识列/*又称为自增长列含义:可以不用手动的插入值,系统提供默认的序列值 特点:1.标识列必须和主键搭配吗?不一定,但要求是一个key2.一个表可以有几个标识列?至多一个!3.标识列的类型只能是数值 ...
- Istio 网络弹性 实践 之 故障注入 和 调用超时
网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 超时时间 工作中常常会碰到这样的开发.测试场景 ...
- 搜索会抓取网站域名的whoise信息吗
http://www.wocaoseo.com/thread-309-1-1.html 网站是否在信产部备案,这是不是会成为影响网站收录和排名的一个因素?百度是否会抓取域名注册人的相关whois信息吗 ...
- 使用 Python破解大众点评字体加密(SVG反扒)
前言 大众点评拥有大量高质量评论信息.种草信息,同时也有非常严格的反扒机制. 今天我们一起使用 Python破解大众点评字体加密,获取极具商业价值的信息. 本文知识点: requests 的使用 xp ...
- 力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= ...
- ZooKeeper的十二连问,你顶得了嘛?
前言 一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 1. 面试官:工作中使用过Zooke ...
- Labview学习之路(二)截屏时弹出来的窗口总是关闭
当屏幕上存在一些弹出来的窗口时,总是会出现一按下截图快捷键那些窗口就关闭的情况,开始我也很苦恼,后来我发现,只要按顺序按下 Ctrl Alt A 就可以让那些窗口不关闭,记住一定 ...
- nginx的gzip压缩
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-ZIP)是一种压缩技术.经过gzi ...
- 同样是logback1.11,更换了log配置后,无论是否有线程持续不断写入log文件,log文件会按设定以日期序号轮换
上次发现了logback1.11的一个bug,即有线程持续写入log,则log文件不会按设定模式进行轮换. 但发现同样采用logback1.11的另外一个工程,它的日志文件就没有错误,于是参照其配置文 ...
- leetcode刷题-64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[ [1,3,1], [1,5, ...