(一)CMake / MsBuild Ninja Make/ MSVC g++ clang++ 等c++编译概念解释

一 概念

  1. CMake 通过 CMakeLists.txt 生成不同平台的构建文件(如 .slnbuild.ninjaMakefile),这些文件属于构建规则描述层,负责定义如何组织编译流程。

  2. 调度器(如 MSBuildNinjaMake)负责解析这些构建文件,调度编译任务。它们属于构建执行层,决定哪些文件需要重新编译以及如何并行执行任务。

  3. 编译器(如 MSVCg++clang++)是实际执行编译的工具,属于底层实现层。它们直接处理源代码,生成目标文件(.o)或可执行文件(.exe)。


二 层级关系总结

2.1层级表格

层级工具/文件作用引用来源
规则生成层CMake、CMakeLists.txt跨平台生成构建规则文件
调度执行层MSBuild、Ninja、Make解析构建文件,调度编译任务
底层实现层MSVC、g++、clang++实际编译源代码,生成可执行文件或库

2.2 关键点说明

  1. CMake 的定位
    CMake 是跨平台抽象层,通过生成适配不同平台的构建文件,屏蔽底层工具链差异。

  2. 调度器的依赖

    • MSBuild 依赖 .sln/.vcxproj 文件(由 CMake 生成),调用 MSVC 编译器。
    • Ninja 依赖 build.ninja 文件,调用 g++clang++
    • Make 依赖 Makefile,调用 g++clang++
  3. 编译器的位置
    g++clang++ 是直接处理代码的最底层工具,它们不依赖其他编译器,仅根据调度器(如 Ninja)的指令完成编译任务。


2.3 示例流程(以 Ninja 为例)

  1. CMake 生成 build.ninja 文件,定义编译规则(如 g++ -c main.cpp -o main.o)。
  2. Ninja 读取 build.ninja,发现 main.o 需要重新编译。
  3. Ninja 调用 g++ 执行编译命令,生成 main.o
  4. 最终链接生成可执行文件。

2.4 示例流程(Windows 平台)​​

  1. CMake 生成 .sln 和 .vcxproj 文件​
    在项目根目录执行以下命令,生成 Visual Studio 解决方案文件和项目文件:(生成器为 Visual Studio 2022)
cmake -G "Visual Studio 17 2022" ..
  1. MSBuild 调用 .sln 文件​
    使用 MSBuild 编译解决方案文件(.sln),触发 .vcxproj 中定义的编译任务:
  2. MSVC 编译源文件生成 .obj
    MSBuild 调用 MSVC 编译器(cl.exe)逐个编译 .cpp 文件,生成对应的 .obj 目标文件:
    /c:仅编译不链接。
    /Fo:指定输出文件名
    bash
cl.exe /c main.cpp /Fo main.obj
  1. 链接 .obj 生成可执行文件(.exe)​​
    MSBuild 调用 MSVC 链接器(link.exe)将所有 .obj 文件和依赖库链接为最终可执行文件:exe

三 总结

  • (上)**CMake 是跨平台生成 **“构建文件”**的工具,生成(build.ninja等)
  • (中)Ninja MsBuild Make是构建工具使用文件build.ninja/sln+vcproject/makefile,负责执行生成规则和调度任务。
  • (下)cl.exe g++clang++ 是底层编译器,直接处理代码生成目标文件。
  • 这种分层设计实现了跨平台兼容性构建效率优化
*vs2019*
cpp
ninja
cpp
cpp
make
cpp
CMake使用CMakelists.txt 参数 -G
sln vcproject 指挥MSBuild.exe
MSVC
MSVC链接生成可执行文件 .exe
build.ninja指挥ninja.exe
g++
win:连接成exe dll / linux 连接成 可执行 o文件
clang++
makefile指挥make.exe
g++

实际上ninja 作为构建工具,可以支持msvc g++ clang++编译器的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值