CMake简易入门
使用CMake编译
CMake工具用于生成Makefile文件。用户通过编写CMakeLists.txt文件,描述构建过程(编译、连接、测试、打包),之后通过解析该文件,生成目标平台的Makefile文件,做到"Write once, run everywhere"。
使用CMake的方法很简单:
|
cmake <projectPath> |
确保projectPath目录下,有CMakeLists.txt文件。该文件当然是用户来编写,所以重点是编写CMakeLists.txt,语法可以参考《CMake 入门实战》,或者官方入门文档:
https://cmake.org/cmake-tutorial/
PS:在Windows下使用时,需要使用VS自带的命令行,不然会找不到cl工具的错误。
成功执行cmake命令后,目录下会生成Makefile文件,不同编译平台生成的文件不同,编译工具也不同。
- 如果是构建平台是MinGW,会什么makefile文件,使用mingw32-make构建。
- 如果构建平台是VS系列,会生成vcxproj文件,可以使用msbuild工具构建。
- 如果构造平台是NMake,可以使用nmake构建。
可以使用以下命令编译:
|
cmake --build <CMakeCachePath> --target <ProjectName> |
CMakeCachePath是指CMakeCache.txt(或CMakeFiles文件夹)所在的路径。
可以使用以下命令清理编译结果:
|
cmake --build <CMakeCachePath> --target clean |
如果CMakeLists.txt文件有修改,再次执行cmake命令,会更新Makefile文件。
关于编译平台的选择
可以使用以下命令,查看cmake支持的构建工具:
|
cmake -G |

在生成Makefile时,指定构建工具:
|
cmake -G "<generator>" <projectPath> |
generator可以是等号左边的名字。
例如,在Windows下,默认生成vcxproj文件(cmake 3.13.0-rc3 + VS2017),如果希望使用nmake构建,可以使用以下命令:
|
cmake -G "NMake Makefiles" <projectPath> |
关于清理生存文件
存在一个问题,没找到较好的解决方案,如何清理CMake产生的文件?
A:可以使用"-B"参数指定生成目录,这样CMake生成的文件都会集中在这个文件,例如:
|
cmake -B <buildPath> . |
之后在编译操作,均要在buildPath文件夹下执行。
特别的,还可以使用"-S"参数指定源码所在的文件夹,源码文件夹必须包含CMakeLists.txt。
详情可以参考:
https://cmake.org/cmake/help/v3.13/manual/cmake.1.html
CMakeLists.txt编写入门
可以使用Qt Creator新建一个CMake工程,每次修改后CmakeLists.txt文件后,可以在"General Messages"窗口,查看输出内容。
基础
CMakeLists.txt由命令构造成,每条命令占一行,换行符结尾,命令的格式如下:
|
commandName(arg1 arg2 …) |
命令名不区分大小写,参数间使用空格分隔。
在CMakeLists.txt中,字符串同C语言中一样,使用双引号包含
输出
使用message()命令,输出信息,至少接受两个参数:
第一个参数指定信息的等级,为空的时候为重要信息,通常使用"STATUS"作为参数,代表该信息为普通说明信息。
第二个参数为一个字符串,可以跟随多个字符串。
例如:
|
message(STATUS "Hello World") |
变量
使用set()命令,自定义变量,至少接受两个参数,第一个参数为变量名,第二个参数为变量的值。参数如果多于2个,那么该变量为一个集合。
特别的,可以使用以下命令设置系统环境变量:
|
set(ENV{<variable>} <value>...) |
访问变量的格式如下:
|
${<variable>} |
访问系统环境变量需要以下格式:
|
$ENV{<variable>} |
CMake内置了许多变量,可以参考:
https://cmake.org/cmake/help/v3.13/manual/cmake-variables.7.html
常用的有:
|
PROJECT_NAME |
项目名 |
|
PROJECT_BINARY_DIR |
项目编译输出路径,调用cmake命令时,使用"-B"参数指定,默认为CMakeLists.txt所在的文件。 |
|
PROJECT_SOURCE_DIR |
项目源码路径,调用cmake命令时,使用"-S"参数指定,默认为CMakeLists.txt所在的文件。 |
|
CMAKE_DEBUG_POSTFIX CMAKE_RELEASE_POSTFIX |
Debug/Release版的动态库后缀 |
|
CMAKE_BUILD_TYPE |
编译类型(Debug、Release),该变量默认为空值 |
内置变量可以在调用cmake命令时,使用"-D"参数设置:

例子
推荐使用以下命令编译,这样生成的文件集中在build文件夹下,不会污染源码文件夹。
|
#cd进入CMakeLists.txt所在的文件夹 cmake -B .\build . cmake --build .\build --target <ProjectName> |
生成可执行文件
|
# 指定cmake最低版本 cmake_minimum_required(VERSION 2.8) # 指定项目名 project(CppDemo) # 生成可执行文件,第一个参数为目标名,之后参数为源文件列表 add_executable(${PROJECT_NAME} "main.cpp") |
生成动态库
|
cmake_minimum_required(VERSION 2.8) project(HelloWorld) # 添加头文件 include_directories($ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32) # 设置生成目录 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}) # 生成链接库文件,三个参数分别是链接库名、链接库类型、源码文件 add_library(${PROJECT_NAME} SHARED HelloWorld.cpp) |
CMake简易入门的更多相关文章
- cmake 简易入门
目录结构 root -| |--**.cpp |--CmakeList.txt |--current path |--(执行cmake ../) |-- (执行make的目录) 步骤: 1 编写 Cm ...
- JNI简易入门
JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...
- 机器学习简易入门(四)- logistic回归
摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...
- Pandas简易入门(二)
目录: 处理缺失数据 制作透视图 删除含空数据的行和列 多行索引 使用apply函数 本节主要介绍如何处理缺失的数据,可以参考原文:https://www. ...
- CMake快速入门教程-实战
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- Web压力测试工具 LoadRunner12.x简易入门教程--(一)回放与录制
LoadRunner12.x简易入门教程--(一)回放与录制 今天在这里分享一下LoadRunner12.x版本的入门使用方法,希望对刚接触LoadRunner的童鞋有所帮助. LoadRun ...
- 转:CMake快速入门教程-实战
CMake快速入门教程:实战 收藏人:londonKu 2012-05-07 | 阅:10128 转:34 | 来源 | 分享 0. 前言一个多月 ...
- crontab简易入门
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
随机推荐
- 四边形不等式优化DP——石子合并问题 学习笔记
好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...
- HDU 5901 Count primes (2016 acm 沈阳网络赛)
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5901 题意:输入n,输出n以内质数个数 模板题,模板我看不懂,只是存代码用. 官方题解链接:https ...
- iOS 启动页放大淡出效果
//屏幕宽度#define kWIDTH [UIScreen mainScreen].bounds.size.width//屏幕高度 #define kHEIGHT [UIScreen mainScr ...
- 1. lvs+keepalived 高可用群集
一. keepalived 工具介绍 1.专为lvs 和HA 设计的一款健康检查工具 2.支持故障自动切换 3.支持节点健康状态检查 二. keepalived 实现原理剖析 keepalived ...
- F - Monkey Banana Problem
F - Monkey Banana Problem Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & ...
- Ajax 中的高级请求和响应
一.概述 在本文中,重点介绍这个请求对象的 3 个关键部分的内容: 1.HTTP 就绪状态 2.HTTP 状态代码 3.可以生成的请求类型 这三部分内容都是在构造一个请求时所要考虑的因素:但是介绍这些 ...
- appium报'Command 'D\:\\android-sdk-windows\\platform-tools\\adb.exe -P 5037 -s “adb device” shell pm clear appPackage' exited with code 1'
解决方法:是因为手机开发者模式没有允许USB调试(安全模式),打开即可
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现
Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...
- 数据库基本表创建 完整性约束 foreign Key
理解以下几张表的内容,根据实际情况设计属性名.数据类型.及各种完整性约束(primary key.foreign key.not null.unique.check),用数据定义语言实现,然后设计实验 ...
- Data Structure Binary Tree: Lowest Common Ancestor in a Binary Tree
http://www.geeksforgeeks.org/lowest-common-ancestor-binary-tree-set-1/ #include <iostream> #in ...