目录
一、CMake、make与g++
1、名词辨析
CMake、make与g++分别是项目构建生成工具、项目构建工具和项目编译链接工具的代表之一。他们的关系可以概括为由项目构建生成工具CMake生成项目构建工具make所需的文件,项目构建工具make利用这些文件编译链接项目;而项目编译链接工具g++可以独立完成项目构建生成工具CMake和项目构建工具make的工作。
所谓Makefile文件,即是make编译、链接的规则性说明文件,作用相当于CMakeLists.txt之于CMake.
2、孰优孰劣
- 既然g++可以完成CMake和make两人的工作,为什么不直接使用g++?
因为直接使用g++的话,面对复杂的工程,多项目、多参数和各种依赖关系,命令代码是很复杂的,而且难以理清工程各种源文件之间的编译顺序,不便于项目管理与维护。对于简单项目,g++自然可以应付的来了。
- make也可以独立完成项目的编译和链接,为什么还需要CMake的帮助?
一句话,CMake的出现就是为了简化和升华make的工作的。Makefile的编码更加严格,语法规则更加复杂,况且Makefile针对不同的操作系统和编译器,编写内容是不同的,平台移植性差。CMake能够更改好的跨平台。一般地说,支持跨平台的原因是有自己独立运行的机制、检测不同平台的能力和针对不同平台生成对应对象的能力。当然,再能够支持第三方库和工具,则更具有可扩展性。CMake便是如此。他使用一套抽象的编译器和操作系统,能够检测不同的操作系统和编译器,并针对它们生成对应的Makefile文件。同样,CMake支持第三方库和工具。这样,便更有利于开发。
二、应用示例
1、工具类安装与配置
1)VSCode安装与配置
这个不要多说,推荐使用免安装版,因为安装版不可选安装路径,占据C盘空间。
官网:Download Visual Studio Code - Mac, Linux, Windows
2)CMake下载与安装
版本:安装版可以自动环境变量配置。
安装步骤:
第一步,直接next
第二步,agree,继续next
第三步,选择加入系统环境变量,方便起见,为所有用户安装,无需创建桌面图标。
第四步,改变安装路径,继续next
第五步,install,等待安装完成。
第六步,验证。win键唤出开始菜单,敲cmd,打开控制台,输入
cmake -version
3)MinGW-W64下载与安装
说明:MinGW-W64就是充当make的工具,对应于Linux的make构建工具,作用基本相同。在下文会说明使用CMake指定生成MinGW编译器的makefile文件。
官网:MinGW-w64
版本:这里我们直接下载mingw-w64,其他工具不做多介绍。主页点击Downloads。
可以看到由很多版本可以选择,我们直接选择右侧sources
选择SourcesFrogs,下载最新版本就好。
点击files栏
A、科学上网法
下拉之后,选择在线安装程序,点击下载之后,跳转等5秒即可开始下载,下载可能有点慢,稍等即可。
第一步,next
第二步,做出如下选择
version:版本选最新的
Architecture:系统架构,64位选择x86_64;32位选择i686
Threads:Windows系统选择win32;跨平台系统选择posix
Exception:异常处理,不管是32位还是64位的,sjlj都是比较老的,选择第一项最新的即可。
Build revision:没得选,0;若有得选,建议默认即可。
第三步,更改安装位置,选择创建开始菜单。然后科学上网,再点next,等待安装完成。
B、无需科学上网法
在线安装程序的下方,就是各种离线包。依据:
version:版本选最新的
Architecture:系统架构,64位选择x86_64;32位选择i686
Threads:Windows系统选择win32;类Unix系统选择posix
Exception:异常处理,不管是32位还是64位的,sjlj都是比较老的,选择第一项最新的即可。
Build revision:没得选,0;若有得选,建议默认即可。
我的话,就选择x86_64-win32-seh这一项,等待下载完成。
下载完成解压提取文件到新建的文件夹下。建议简化解压目录,剪切mingw64到外层文件夹即可。
设置系统环境变量。
win键唤起开始菜单,输入环境变量,打开编辑系统环境变量。
双击path,新建->浏览,
定位到解压目录即可。
验证:win键唤起开始菜单,输入cmd,输入代码,g++也可以。
gcc -v
弹出版本信息。输入代码
where gcc
显示安装位置。
这样一来,我们已经可以使用cmake和make来编译我们的项目啦。为了使VSCode更好使用,我们安装一些插件。
4)VSCode推荐插件
打开VSCode,快捷键F1,选择extension
A、c/c++编译环境配置
扩展搜索框搜索:c/c++
安装C/C++ Extension Pack,会附带安装4个扩展,方便快捷。
有一个设置弹窗,可以进行设置
显示在侧边栏,方便一些
B、Fitten Code
这是一个类GitHub Copilot插件,可代码补全、代码解释、生成代码以及对话等。就是需要注册一个账号,介意的话,就不要使用了。
2、CMake使用示例
寄语:希望我能做到你不用动手就能获取使用经验
本教程有官方示例,可参阅网址:CMake Tutorial — Mastering CMake
官方文档虽然很正式,但是毕竟是全英文,而且不如结合VSCode实际操作来得直观。本教程还是有一定价值的。我们就参考着官网文档和源码从零开始一步一步展示cmake示例。
官网操作源码地址:CMake Tutorial — CMake 3.29.1 Documentation
点击如下链接即可。
第一步 创建简单项目
A、新建并打开项目文件夹
新建一个空白文件夹(无中文路径是基本默认的)作为我们项目文件夹,打开VSCode,打开文件夹。
B、新建所需文件
新建文件CMakeLists.txt、tutorial.cpp和TutorialConfig.h.in,注意后缀一起当文件名填上,文件大小写是敏感的,这样规范。
C、点击tutorial.cpp文件
输入代码
// A simple program that computes the square root of a number
#include <iostream>
#include <string>
#include "TutorialConfig.h"
#include "MathFunctions.h"
#include <math.h>
int main(int argc, char* argv[])
{
if (argc < 2) {
// report version
std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << std::endl;
std::cout << "Usage: " << argv[0] << " number" << std::endl;
return 1;
}
// convert input to double
const double inputValue = std::stod(argv[1]);
const double outputValue = mathfunctions::sqrt(inputValue);
std::cout << "The square root of " << inputValue << " is " << outputValue
<< std::endl;
return 0;
}
D、点击CMakeLists.txt 文件
输入代码
# 用于设定项目所需的最低 CMake 版本
cmake_minimum_required(VERSION 3.10)
# 设置项目名称和版本号
project(Tutorial VERSION 1.0)
# 设置c++标准为23
set(CMAKE_CXX_STANDARD 23)
# 设置c++标准为23时,要求编译器必须支持该标准
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 设置文件,在构建项目时由前者生成后者。
configure_file(TutorialConfig.h.in TutorialConfig.h)
# CMake使用源文件 tutorial.cpp 创建一个名为 "Tutorial" 的可执行文件
add_executable(Tutorial tutorial.cpp)
# 设置头文件搜索路径
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
通俗点说
- cmake_minimum_required()指定cmake的最低版本,低于指定版本就不行。
- project()设定最后生成的可执行文件叫什么名字和目前的版本号。
- set(CMAKE_CXX_STANDARD 23)设置c++标准为23
- set(CMAKE_CXX_STANDARD_REQUIRED True)设置c++标准为23时,要求编译器必须支持该标准
- configure_file(TutorialConfig.h.in TutorialConfig.h)设置文件,用于存放cmake的一些设置信息,在构建项目时由前者生成后者。后者默认存放于构建项目生成路径,因而,需要target_include_directories()设置项目包含的头文件所在的路径。
- add_executable()指示编译哪些源文件,最后生成对应名称的可执行文件。若有多也不多个源文件,如两三个,则用空格隔开就行,如add_executable(mytest a.cpp b.cpp),即是编译a.cpp和b.cpp,生成mytest.exe的可执行文件。还可以这么做
-
set(SRC_LIST a.cpp b.cpp c.cpp) add_executable(${PROJECT_NAME} ${SRC_LIST})
set
命令指定 SRC_LIST 变量来表示多个源文件,用${
SRC_LIST}
获取变量的值。- target_include_directories()设置我们的项目应该在哪里找到构建项目的文件。下文会进行外部构建,生成的构建项目的文件将放在build文件夹中,cmake将会自动探测并定位到./build路径。.表示当前路径目录,..表示上一级路径目录。public即是构建文件的可见性为最高级,大家都能见到。
E、点击TutorialConfig.h.in文件
输入代码
// 定义宏,表示项目的版本号,由CMakeLists.txt文件中的set(Tutorial_VERSION_MAJOR 1)和set(Tutorial_VERSION_MINOR 0)命令设置。
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
项目版本号的配置文件。一大一小。编译后,会在build构建文件下生成TutorialConfig.h头文件。
F、构建和运行
打开控制台,顶部栏Terminal->new Terminal,输入代码创建build文件夹
mkdir build
build文件夹将是我们cmake存放生成构建项目文件的文件夹。由 TutorialConfig.h.in文件通过cmake构建生成的TutorialConfig.h就将存放于此。上文
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
PROJECT_BINARY_DIR就将是./build文件目录。这由cmake自动完成探测。
然后,使用控制台cd到文件目录build。即是在当前目录更进一步到build目录。
cd build
1)cmake不指定编译器
准备生成构建项目文件。
- 此次构建未指定编译器。
- Windows系统下,如果安装了Visual Studio,默认使用MSVC编译器。后续构建时使用MinGW编译器将会报错。
cmake ..
因为项目的顶级CMakeLists.txt 文件在当前文件目录build的上一级,所以是cmake ..,两个英文句号。一个英文句号.表示当前目录。目录下一定要有CMakeLists.txt 文件。
可以看到,生成的配置文件 TutorialConfig.h。当然,还没有进行编译。这将调用默认编译器进行编译。build不是我们新建的build文件夹哦。
cmake --build .
此时将对项目进行编译。
运行生成的可执行文件,位于./build/Debug文件夹下。
第一次运行控制台少了数字报错错误,看 tutorial.cpp代码即可知道为什么。./Debug/Tutorial 为可执行文件的路径。由于当前在bulid目录,因此用.代替即可。
2)mingw32-make副本改名make
若我们使用MinGW编译器编译文件,将会报错。
mingw32-make
- 为什么是mingw32-make,而不是Linux常见的make?
- 请打开mingw64的安装位置,可以找到mingw32-make.exe文件。我们就是使用它编译的。
- 若想简单点,复制mingw32-make.exe文件,然后粘贴到当前文件夹,系统自动创建副本,然后改名为make.exe,就能使用make了。
3)cmake指定Mingw编译器及各编译器参数
下面我们删除build下的所有文件,使用cmake指定编译器进行生成MakeFiles构建文件。
cmake -G"MinGW Makefiles" ..
- cmake命令,-G指定使用哪种编译器。MinGW编译器对应的值为“MinGW Makefiles”,同样的,两个英文句号..表示顶层CMakeLists.txt文件在上一级。
- 其他编译器对应的值为(别问我怎么得到的,MinGW Makefiles打成了MinGW MakeFiles,说明大小写敏感)
-
Visual Studio 17 2022 = Generates Visual Studio 2022 project files. Use -A option to specify architecture. Visual Studio 16 2019 = Generates Visual Studio 2019 project files. Use -A option to specify architecture. Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 12 2013 [arch] = Deprecated. Generates Visual Studio 2013 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 9 2008 [arch] = Deprecated. Generates Visual Studio 2008 project files. Optional [arch] can be "Win64" or "IA64". Borland Makefiles = Generates Borland makefiles. NMake Makefiles = Generates NMake makefiles. NMake Makefiles JOM = Generates JOM makefiles. MSYS Makefiles = Generates MSYS makefiles. MinGW Makefiles = Generates a make file for use with mingw32-make. Green Hills MULTI = Generates Green Hills MULTI files (experimental, work-in-progress). Unix Makefiles = Generates standard UNIX makefiles. Ninja = Generates build.ninja files. Ninja Multi-Config = Generates build-<Config>.ninja files. Watcom WMake = Generates Watcom WMake makefiles. CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files (deprecated). CodeBlocks - NMake Makefiles = Generates CodeBlocks project files (deprecated). CodeBlocks - NMake Makefiles JOM = Generates CodeBlocks project files (deprecated). CodeBlocks - Ninja = Generates CodeBlocks project files (deprecated). CodeBlocks - Unix Makefiles = Generates CodeBlocks project files (deprecated). CodeLite - MinGW Makefiles = Generates CodeLite project files (deprecated). CodeLite - NMake Makefiles = Generates CodeLite project files (deprecated). CodeLite - Ninja = Generates CodeLite project files (deprecated). CodeLite - Unix Makefiles = Generates CodeLite project files (deprecated). Eclipse CDT4 - NMake Makefiles = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - MinGW Makefiles = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files (deprecated). Kate - MinGW Makefiles = Generates Kate project files (deprecated). Kate - NMake Makefiles = Generates Kate project files (deprecated). Kate - Ninja = Generates Kate project files (deprecated). Kate - Ninja Multi-Config = Generates Kate project files (deprecated). Kate - Unix Makefiles = Generates Kate project files (deprecated). Sublime Text 2 - MinGW Makefiles = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - NMake Makefiles = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - Ninja = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files