100编程书屋_孔夫子旧书网
前言
CMake是一个构建工具,通过它可以很容易创建跨平台的项目。通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序)。使用CMake的一个主要优势是在多平台或者多人协作的项目中,开发人员可以根据自己的喜好来使选择IDE,不用受其他人工程配置的影响,它有点像跨平台的IDE,通过它配置好相关设置之后,可以在多个平台无缝衔接,提高开发效率。
最简单的CMake工程
项目搭建
一个用CMake来管理的项目,其项目根目录通常会包含一个CMakeLists.txt的文件,当然子目录可能也有,这种情况我们稍后再说。我们先从最简单的项目开始。以下就是一个最简单的工程示例:
CMakeProject
| CMakeLists.txt
| main.cpp
这就是完整的可以跑起来的最小项目了。按照顺序,我们来看看文件里的内容
CMakeLists.txt
# 设置版本号
cmake_minimum_required(VERSION 3.10)
# 设置项目名
project(CMakeProject)
# 设置产物和源码的关联
add_executable(${CMAKE_PROJECT_NAME} main.cpp)
说明:
CMake中命令不区分大小写
以#开始的是备注
引用变量语法${变量名}
所以文档中真正的有效内容就三行,
cmake_minimum_required(VERSION 3.10)设置了CMake支持的最低版本,VERSION是参数名,后面是版本号,可以根据自己的需要修改。 注意参数名和参数是以空白符分隔的,不是逗号, 不然会报错。
project(CMakeProject)CMake中字符串可以带引号或者不带,效果是一致的,这一行就是配置了项目名,如生成的Visual Studio的工程名就是依据这个名字来的。
add_executable(${CMAKE_PROJECT_NAME} main.cpp)
才是真正管理源码和目标产物的地方,这里我们使用了引用变量的写法,而文件中没有定义这个变量,说明这个变量存在于CMake中,在CMake还有很多预定义的变量,我们可以直接通过这种方式引用,上面的写法是将项目名设置为产物的名字,当然也可以直接填字符串,取个另外的名字都是可以的。后面的main.cpp则是用来生成产物的源码路径,这就是CMake最灵活的地方。源码路径可以是多样的,查找出来的,直接写的,相对路径,绝对路径都可以。 多个源码的话就用空白符分隔,依次写就行了。
在上面的配置文件中,我们配置了它的源文件为main.cpp,我们想通过它来生成一个可执行的程序,内容也很简单:
#include <iostream>
int main()
{
std::cout<<"hello CMake"<<std::endl;
return 0;
}
项目编译与执行
准备工作已经做完,接下来我们就要使用CMake生成可执行文件了。
第一步当然是要安装CMake啦,这是下载地址!Download,根据自己的平台选择下载即可,安装完成之后需要把它添加到环境变量中,便于我们在任何地方都能方便使用。
安装了CMake以后,打开命令行工具,进入到刚才创建的项目根目录,也就是进入到存着CMakeLists.txt和main.cpp的目录,下一步准备生成项目。
通常为了不影响和污染当前的工作环境,我们会选择新建一个目录来存放生成的工程文件,以下我主要以Windows平台为主要平台讲解,其他平台基本一致。
mkdir build #创建文件夹,存储工程文件;
cd build #切换cmake工作目录;
cmake .. #生成项目文件;
这三步执行完后,我们就可以在build文件夹下看到里面已经生成了一个Visual Studio的工程,我们可以直接用Visual Studio打开这个工程,按照我们的习惯执行编译和调试。当然,假如想最快地生成可执行文件,我还是推荐使用CMake。
使用CMake执行编译,只需要在上一步的基础上(也就是已经成功执行了上面的三个步骤)再执行一个命令cmake --build .就可以了。这里切记不能少第三个英文句号,它代表在当前的工作目录中执行CMake的编译。
假如上面的四步都一切顺利的话,那么,我们就可以在build/debug目录下看到以add_executable的第一个参数命名的可执行文件(这里就是CMakeProject.exe),双击或者把它拖到命令行就可以执行它了。
项目扩展
在前面的例子中,生成工程文件,我们使用了两个命令,其实,这里可以直接用一个命令就可以完成——cmake build -S . -B build。这个命令的意思是以当前路径为工作路径,以build目录为生成目录,生成工程文件,也就是不需要我们手动创建build文件夹了。其中 -S参数配置的是源路径,-B配置的是生成路径。
另外,由于CMake没有清理方法,所以每次修改CMake的配置(也就是新增或者删除CMakeLists.txt中的代码),需要重新生成工程文件的时候,需要我们手动清理生成目录,保证它是空目录,假如不这样做,那么项目可能生成失败或者新配置不起作用。假如只是修改了