前言
工欲善其事,必先利其器。工作中经常用到的各种’东西’,如CMake、QMake、Make、MSBuildCLang、GCC、MinGW、MSVC等,有些在命名上有些类似,实际作用却不尽相同。
因此这里换个角度来了解下这些‘东西’的作用,以及这些‘东西’之间的联系。
组成
基于多年开发经验,这里将个人理解的开发环境划分成4个部分:
下面开始逐一介绍。
构建系统
构建系统,是构建系统生成器的简称,它读取CMakeList.txt中的指令,生成特定构建工具(例如 Make、Ninja、Visual Studio、Xcode)所需的构建文件(例如 Makefile、.sln、.xcodeproj)。
这里引出下面要介绍的构建工具。
常见的不同平台的构建系统(构建系统生成器)有:
CMake(跨平台通用)
CMake是目前最流行的跨平台构建系统生成器,广泛用于 C/C++ 项目(也支持其他编程语言),它使用 CMakeLists.txt 文件描述项目信息,通过CMake,可以生成各种构建工具的所需构建文件,例如 Makefile (用于 Make)、Ninja 构建文件、Visual Studio 解决方案文件 (.sln)、Xcode 项目文件 (.xcodeproj) 等。
QMake(跨平台通用)
QMake是Qt 官方提供的构建系统生成器,仅支持C++。
QMake使用 .pro 文件描述项目信息,通过QMake可以生成 Makefile(用于 Make)、Visual Studio 项目文件(.sln)。
QMake与 Qt 框架集成紧密,可以方便地处理 Qt 特有的构建步骤,例如 moc、uic 和 rcc。
Meson(Linux/macOS)
Meson是一个在 Linux 桌面开发领域相对较新的构建系统生成器,旨在提供更快的速度和更简洁语法的构建系统生成器。它使用简单的声明式语言描述构建过程,默认使用 Ninja 作为构建工具,当然也支持其他构建工具。
Autotools(Linux/macOS)
Autotools 是一套用于生成可移植的构建系统的工具集,它由 Autoconf、Automake 和 Libtool 等工具组成,共同协作来创建 configure 脚本和 Makefile 文件。
相当于是自带了构建系统、构建工具。扩展性较差,较为局限。
至此可以知道:构建系统(生成器)需要项目描述文件,并以此生成构建工具所需的构建文件。
构建工具
上面提到了构建系统(生成器)生成了各种构建文件,拿到构建文件后,构建工具就开始介入构建流程了。
构建工具,可以理解成自动化构建过程的工具,它们管理编译、链接、打包等步骤,并处理依赖关系。
常见的不同平台的构建工具有:
Make (GNU Make)
Make是一个经典的构建工具,使用 Makefile 文件描述构建规则,广泛用于 C/C++ 项目,支持 Linux/macOS。
Ninja
Ninja是一个小型的、专注于速度的构建系统,它旨在提供尽可能快的构建速度。
Ninja支持 Windows/Linux/macOS。
MSBuild (Microsoft Build Engine)
MSBuild 是微软的构建工具,用于构建应用程序。
它是 Visual Studio 的核心构建引擎,也支持在命令行中使用。
MSBuild 使用 XML 格式的项目文件(例如 .csproj、.vbproj、.vcxproj)来描述构建过程。
仅支持 Windows。
nmake
nmake 是微软的命令行构建工具,类似于 Unix 系统中的 make。
它读取 Makefile 文件,其中包含了构建项目的规则,然后根据这些规则执行相应的命令,从而自动化构建过程。
仅支持 Windows。
至此可以知道:构建工具通过构建系统(生成器)生成的构建文件,开始自动化构建过程(编译、链接、打包、处理依赖等)。
编译器
通过对构建工具的介绍,这里可以知道编译是构建中的一环,大致流程如下:
此外的预处理器、链接器等因篇幅有限不再过多介绍。
常见的不同平台的编译器如下:
GCC
GCC是一个开源的编译器套件,支持多种编程语言,包括 C、C++、Fortran、Java 等。
GCC 不仅是编译器,它还包含其他工具,例如汇编器、链接器等,因此被称为“编译器套件”。
GCC通常与 Make构建工具一起使用。
支持 Linux/macOS。
CLang
CLang是一个基于 LLVM 的开源编译器前端,它旨在提供更快的编译速度、更好的错误诊断信息和更模块化的设计。
Clang 支持 C、C++、Objective-C 和 Objective-C++ 等语言。
Clang 通常与 LLVM 的后端一起使用,LLVM 提供代码优化和目标代码生成等功能。
Clang/LLVM 通常使用 Make 作为构建工具。
仅支持 macOS。
MinGW
MinGW是 GCC 在 Windows 平台上的一个移植版本,提供了一组 GNU 工具,包括 GCC 编译器、GNU binutils(包含汇编器、链接器等)以及其他必要的工具,MinGW 通常与 MSYS(Minimal System)或 MSYS2 结合使用,后者提供了一个类似 Unix 的 shell 环境,使得在 Windows 上可以使用 GNU 工具链进行开发。
MinGW使用自带Make作为构建工具。
仅支持 Windows。
MSVC
MSVC是微软的 C++ 编译器,是 Visual Studio IDE 的一部分。
MSVC 与 Visual Studio 集成紧密,提供了良好的 IDE 支持和调试功能。
Visual Studio 使用 MSBuild 作为构建工具。
仅支持 Windows。
编程语言/框架
不同编程语言使用的构建系统、构建工具、编译器等不尽相同,主流的有:
C、C++、Java、Python、Swift等。
集成开发环境(IDE)
集成开发环境(Integrated Development Environment,简称 IDE)是一种软件应用程序,它为程序员提供了一个统一的、多功能的平台,用于软件开发的各个阶段,从编写代码、调试到测试和部署。
常见的集成开发环境有:
VS Code本来是一个编辑器,本身并不自带编译器、链接器、调试器等工具,而是通过插件的方式外部调用系统已安装的工具进行实际开发。
应用示例
这里以C++/Qt为例,列举实际开发时所需环境:
Windows
环境①:
QMake + MSBuild/nmake + MSVC + Visual Studio/Qt Creator/VS Code
构建系统选择QMake,构建工具选择微软的MSBuild或nmake,编译器使用MSVC,IDE可选择VS、Qt Creator或VS Code。
环境②:
QMake + GNU Make + MinGW + Qt Creator/VSCode
构建系统选择QMake,构建工具选择GNU Make(GCC的Windows移植版),编译器使用MinGW,IDE可选择Qt Creator或VS Code。
环境③:
CMake + MSBuild/nmake + MSVC + Visual Studio/Qt Creator/VS Code/CLion
构建系统选择CMake,构建工具选择微软的MSBuild或nmake,编译器使用MSVC,IDE可选VS、Qt Creator、VS Code或CLion。
CLion对QMake的支持不太好,因此使用CMake的项目才考虑使用。
环境④:
CMake + GNU Make + MinGW + Qt Creator/VS Code/CLion
构建系统选择CMake,构建工具选择GNU Make(GCC的Windows移植版),编译器使用MinGW,IDE可选Qt Creator、VS Code或CLion。
Linux
环境①:
QMake + Make + GCC + Qt Creator/VS Code/CLion
构建系统选择QMake,构建工具系统自带的Make,编译器使用GCC,IDE可选择Qt Creator或VS Code。
环境②:
CMake + Make + GCC + Qt Creator/VS Code/CLion
构建系统选择CMake,后续选择同①。
通用
至此可以确定较为通用的环境如下:
构建系统:CMake 或 QMake
构建工具:Make(Windows有移植版)
编译器:GCC(Windows有移植版MinGW)
IDE:Qt Creator、CLion、VS Code