CMake工具链安装

基本概念

常用编译器

介绍C/C++项目中的主流编译器

  1. GCC (GNU Compiler Collection)
    官网: https://gcc.gnu.org/
    GCC 是自由软件基金会(FSF)的关键项目。它包含了C、C++、Objective-C、Fortran、Ada、Go等多种语言的编译器。其中的C编译器通常被称为gcc。

特点:
跨平台: 支持几乎所有主流操作系统(Linux, Windows (通过MinGW或Cygwin), macOS, 各种BSD等)。
高度可移植: 是许多Unix-like系统的标准编译器。
高度优化: 提供从-O0到-O3、-Os等多种优化级别,生成的代码性能极高。
标准符合度高: 对C89、C99、C11、C17等标准支持非常好。

常见用法:

gcc -o hello hello.c          # 最基本编译
gcc -Wall -g -o hello hello.c # 开启所有警告(-Wall)和调试信息(-g)
gcc -O2 -o hello hello.c      # 使用2级优化
  1. Clang / LLVM
    官网: https://clang.llvm.org/
    Clang是LLVM项目的前端,专门负责C、C++、Objective-C等语言的编译。LLVM则负责优化和生成机器码。通常我们说的用Clang编译指的是使用clang这个命令。Clang是macOS和iOS开发的默认编译器,在Linux和Windows上也广泛使用。

特点:
报错信息非常清晰、友好,编译速度快,内存占用低。
模块化设计: 与IDE(如Xcode)集成得更好。
高度兼容GCC: 在大多数情况下可以直接替换GCC。

常见用法: (与GCC几乎完全相同)

clang -o hello hello.c
clang -Wall -Wextra -g -o hello hello.c
  1. MSVC (Microsoft Visual C++)
    简介: 微软开发的C/C++编译器,是Visual Studio IDE的一部分。

特点:
Windows原生: 与Windows平台和Windows SDK集成度最高,是开发Windows应用程序和游戏的首选。
强大的IDE集成: 在Visual Studio中提供了无与伦比的调试和开发体验。
兼容性: 对C99标准支持较晚且不完整,但对C++标准支持很好。更专注于微软自身的扩展和Windows生态。
使用: 通常在Visual Studio的图形界面中点击按钮即可编译。命令行工具为cl.exe。

  1. MinGW-w64 (Minimalist GNU for Windows)
    MinGW是GCC编译器在Windows上的一个移植版本,它生成本地的Windows可执行文件(如.exe和.dll),而不需要像Cygwin那样的兼容层。
    用途: 在Windows上获取GNU开发环境(GCC, GDB, make等)的最流行工具。很多开源项目都提供基于MinGW-w64编译的Windows版本。

Make

Make是主要用于C/C++项目的构建自动化工具,通过 Makefile 文件中的一系列规则定义整个构建步骤,和 Java 中的 Ant 类似。

make 会通过读取 Makefile 的配置文件,来自动化编译和链接源代码的过程。Makefile 需要定义文件之间的依赖关系和修改时间,决定哪些部分需要重新编译,从而高效地构建项目。

许多IDE(尤其是Linux/跨平台C++开发用的IDE)底层会调用或支持 make 作为其一种构建后端,但不是所有IDE都用 make。很多大型IDE(如VS, Xcode)使用自有构建系统。现代趋势是:IDE 作为前端,构建工具作为后端。像 CMake 这样的构建系统生成器成为了事实上的标准。IDE 负责展示代码、提供调试界面,而构建工作则交给 CMake + Ninja/make 这样的专业工具组合来完成。IDE 通过调用这些工具的命令行接口来与之交互。

  1. 使用自有/原生构建系统的IDE:这类IDE通常与特定的编译器生态系统紧密绑定,拥有自己的一套项目文件和构建引擎。

Microsoft Visual Studio (Windows):
构建引擎: MSBuild。项目文件: .vcxproj (C++), .csproj (C#) 等。
Visual Studio 使用自有的 MSBuild 引擎来解析项目文件,决定编译顺序、调用编译器 (cl.exe)、链接器 (link.exe)。它不使用 make 或 Makefile。其项目文件是 XML 格式的。

Xcode (macOS/iOS):

构建引擎: xcodebuild。项目文件: .xcodeproj (实际上是一个包目录)。
Xcode 使用自家的 xcodebuild 系统来管理构建过程。虽然它支持导入 Makefile 项目,但其原生开发绝不使用 make。

  1. 使用标准构建工具(如make)作为后端的IDE:这类IDE通常是跨平台的,它们更倾向于充当一个强大的图形前端,而将实际的编译工作委托给业界标准的工具。

Qt Creator (跨平台):后端可以直接使用 make(当项目是 qmake 或 CMake + Makefile 时),也可以使用 Ninja(一种比 make 更快的构建工具,通常是 CMake 的默认生成器),甚至是 MSBuild(在 Windows 上构建 Visual Studio 项目时)。
Qt Creator会解析 CMakeLists.txt 或 .pro 文件,生成构建命令,然后调用 make、ninja 等工具来执行,并捕获它们的输出显示到界面上。

Eclipse (用于C/C++):后端通常使用 make。Eclipse CDT(C/C++开发插件)内部管理着项目的依赖和构建规则,但它默认会生成 Makefile 然后调用外部的 make 程序来执行构建。你也可以将其配置为使用其他构建系统。

很多Linux上的轻量级IDE/编辑器 (如Geany, VS Code):后端直接调用编译器命令 (gcc, g++) 或通过 make。这些工具本质上是在帮你自动填写和执行终端命令。你可以配置它们的构建任务为 make -j4,那么当你按下构建按钮时,它们就是在后台终端里执行了这个 make 命令。

  1. 作为构建工具前端的IDE(现代常见模式)
    这是目前最主流的模式。IDE 不再关心底层用什么具体工具构建,而是作为构建工具的前端界面。

Visual Studio Code (几乎所有语言): VS Code 本身几乎没有自己的构建系统。它完全依赖插件。

C++ 开发: 安装了 CMake 插件后,VS Code 会调用 cmake 命令来生成构建文件(如 Makefile 或 ninja.build),然后调用 make 或 ninja 来执行构建。
Python/JavaScript/Go 开发: 它会调用相应语言的构建/运行命令(如 python, npm, go build)。

CLion (跨平台 C++ IDE):后端主要支持 CMake,其次是 Makefile、编译数据库等。
机制: CLion 深度集成 CMake。它自己内置了 CMake 解析器来理解你的项目结构,但最终执行构建时,默认会生成 Ninja 脚本并调用 ninja 命令来执行,以获得最快的构建速度。它也可以生成 Makefile 并调用 make。

CMake

CMake 的核心工作:CMake本身 不是一个编译器。它是一个构建系统生成器。它读取你编写的 CMakeLists.txt 脚本文件,然后根据该脚本和用户的配置,生成另一种构建系统(如 Visual Studio 的 .sln 解决方案、Makefile、Xcode 项目等)所需要的文件。

CMake-GUI?

传统方式:通常在命令行中需要使用 cmake -B build -DCMAKE_BUILD_TYPE=Release .. 这样的命令来配置和生成构建文件。这需要你记住各种参数和变量名。
CMake-GUI 是 CMake build system generator的官方图形用户界面(GUI)工具。它是一个跨平台的桌面应用程序,允许开发者通过点击和填写表单的方式来配置和生成项目构建文件,而无需在命令行中手动输入命令。可以把它理解为CMake 的可视化控制面板。

CMake-GUI

CMake-GUI 将这个命令行过程图形化。它提供了一个直观的窗口,让你可以:
通过点击按钮选择源代码和构建目录。
通过下拉菜单选择要生成的构建系统类型(如 Visual Studio, Makefiles 等)。
在一个清晰的列表中查看和修改所有可配置的变量(如编译选项、路径、功能开关)。
无需记忆命令,通过点击 Configure和Generate按钮来完成所有工作。

工具安装及配置

安装MinGW

https://www.mingw-w64.org/downloads/

  1. Github
    Github上由他人打包好的二进制程序
    MinGW有一个在线安装程序:MinGW-W64 online installer,网络好的话可以到Github下载:https://github.com/niXman/mingw-builds-binaries?tab=readme-ov-file
    image

也可以直接下载MinGW二进制包,二进制包同样可以在Github的Release页面下载
image
GitHub 上较新版的压缩包的命名又分为 msvcrt 和 ucrt。MSVCRT(Microsoft Visual C++ Runtime)和 UCRT(Universal C Runtime)是 Microsoft Windows 上的两种 C 运行时库。MSVCRT 在所有 Windows 版本上均可用,从 Windows 10 起,支持 UCRT。若支持 UCRT 则建议选择 UCRT。

  1. SourceForge

也可以在SourceForge网站下载MinGW二进制包: https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
image

对于文件名的解释如下:
Version:GCC 版本,若无特殊要求,选择最新版本即可。

  1. 架构:i686 和 x86_64 的区别是指编译器的目标架构。这两者之间有一些区别,例如在寄存器数量和大小,内存寻址,指令集等方面。i686 是 32 位的 x86 架构,另外Win32 - i686 - Windows 32 位版本,本机运行并针对 Windows 32 位进行编译(也可在 Windows 64 位上运行,但在 32 位模式下)。x86_64 是 64 位的 x86 架构。Win64 - x86_64 - Windows 64 位版本,本机运行并针对 Windows 64 位进行编译(不会在 Windows 32 位上运行),64系统 位选择 x86_64,32 位系统选择 i686。

  2. posix 和 win32 的区别是指编译器使用的线程模型。posix 是一种 UNIX API 标准,而 win32 是 Windows 的 API 标准。这两者之间有一些区别,例如在 mingw-w64 中,使用 posix 线程将启用 C++11/C11 多线程功能,并使 libgcc 依赖于 libwinpthreads。而使用 win32 线程则不会启用 C++11 多线程功能。MCF是MCF Gthread是Windows 7及更高版本的线程支持库,它实现了gthread接口集,GCC在内部使用它来提供本地静态对象的初始化同步,libstdc++在内部使用它来提供C++11线程工具。Windows 选择 win32,Linux、Mac OS 等其他操作系统选择 posix。

  3. 异常机制:seh 和 dwarf 的区别是指编译器使用的异常处理模型。seh 的意思是结构化异常处理(Structured Exception Handling),是一种在 Windows 上处理异常的机制。seh 可以处理硬件异常(如除零错误)和软件异常(如访问无效内存)。seh 也可以与 C++ 异常兼容。dwarf 是一种在 Linux 上处理异常的机制,它使用了一种叫做 DWARF 的调试信息格式来描述程序的结构和行为。dwarf 可以处理 C++ 异常,但不能处理硬件异常。SJLJ:支持 32/64 位系统。DRARF:仅支持 32 位系统,性能优于 SJLJ。SEH:仅支持 64 位系统,性能优于 SJLJ。

  4. msvcrt 的意思是 Microsoft Visual C++ 运行时(Microsoft Visual C++ Runtime),是一个提供 C 标准库函数的动态链接库。msvcrt 是 Windows 系统自带的,但由于向后兼容性的问题,它没有完全遵循 C99 标准,并且缺少一些功能。ucrt 的意思是通用 C 运行时(Universal C Runtime),是一个提供 C 标准库函数的动态链接库。ucrt 是 Windows 10 及更新版本的系统自带的,它遵循了 C99 和 C11 标准,并且提供了一些额外的功能。

  5. 一些镜像地址,可能版本不是那么全
    阿里云:https://mirrors.aliyun.com/gnu/gcc/gcc-12.2.0/
    清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/cygwin/x86_64/release/mingw64-x86_64-gcc/

如果通过在线安装程序安装,双击点击下一步,依次选择版本12.2.0,64bit,thread pool选win32,revison选择rev2,ucrt,最后点击 Process,然后等待下载完成
如果是下载离线安装包进行安装,按照离线安装这类命令行工具的常见流程即可:

  1. 将压缩包解压到某个目录
  2. 配置环境变量,在系统变量 Path 中新增项,值为解压目录下bin目录的绝对路径
  3. 通过执行 gcc -v 或者 gcc --version 命令进行验证,若显示版本,则说明安装配置成功。

Windows安装Make

注意:安装Make之前需要先安装MinGW

make 工具本身与 GCC 版本没有直接的兼容性问题,因为 make 是一个构建自动化工具,它从 Makefile 文件中读取指令来调用编译器,而 GCC 则是实际的编译器。兼容性问题通常源于 Makefile 文件中调用的 GCC 版本,例如 Makefile 明确指定了某个 GCC 版本,或者代码中使用的 C/C++ 特性仅被特定版本的 GCC 支持。

前面安装的MinGW的bin目录里面有mingw32-make.exe,为方便起见可以重命名为make.exe,添加到环境变量PATH,如果不想用这个也可以按下面方式单独安装make

官网:https://www.gnu.org/software/make/
下载地址:https://gnuwin32.sourceforge.net/packages/make.htm
image
点击框中的下载,下载后安装。安装程序不会自动设置环境变量,需要手动把安装路径添加到环境变量 PATH 中。然后终端执行make -v命令,出现Make版本信息,安装成功:
➜ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

Windows安装Cmake

安装程序官网下载地址:https://cmake.org/download/
image

直接一直下一步安装即可,安装过程会同时安装CMake-GUI工具

MSYS2

MSYS2 是一个为 Windows 提供类似 Linux 开发环境的工具集合,方便的话安装这一个就够了。主要包括:一个类 UNIX 的 shell 环境(基于 Bash 和 mintty)、Arch Linux上的软件包管理器(Pacman)、以及用于原生 Windows 软件开发和跨平台开发的 MinGW-w64 工具链(如 GCC 编译器)和各种 GNU 工具(如 Git、Make 等)。

MSYS2 主要包含的组件:

  1. 类 UNIX Shell 环境:Bash 和 mintty:提供了一个强大的、类似于 Linux 的命令行终端,允许用户使用许多常见的 GNU/Linux 命令和工具。POSIX 兼容层:MSYS2 基于 Cygwin 的修改版本,提供了一个模拟 POSIX 标准的环境,使得在 Windows 上运行许多 Linux 应用程序成为可能
  2. 软件包管理系统:Pacman:一个由 Arch Linux 移植而来的软件包管理器,极大地简化了软件包的安装、更新和管理过程。软件包仓库:提供了一个包含大量预构建软件包的仓库,用户可以通过 Pacman 轻松安装各种开发工具和库
    3.MinGW-w64 工具链和库:MinGW-w64:一个提供用于原生 Windows 应用程序开发的工具链,包括了 GCC 编译器、GDB 调试器等。多种编译工具:为 GCC、CPython、CMake、OpenSSL、FFmpeg、Rust、Ruby 等提供了最新的本地构建版本
    4.其他 GNU 工具和库
    5.版本控制系统:如 Git 和 Subversion
    6.构建工具:如 Make
    7.其他工具:如 tar、awk、grep、sed 等,以及许多专门为 Windows 平台开发的库

官网下载安装程序:https://www.msys2.org/ ,官网就有详细的安装步骤
image

WSL

Windows下使用 GCC,可以直接选择使用 WSL

Ninja

https://github.com/ninja-build/ninja
Ninja对标的是Make,而不是Cmake,其脚本文件后缀为.ninja,对应makefile。Ninja功能没有makefile多,优点是构建速度快
Cmake是可以生成.ninja和.makefile的工具。

posted @ 2025-09-19 22:11  vonlinee  阅读(28)  评论(0)    收藏  举报