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

news2025/4/22 6:53:36

c++ 几个编译概念

  • 一 概念
  • 二 层级关系总结
    • 2.1层级表格
    • 2.2 关键点说明
    • 2.3 示例流程(以 Ninja 为例)
    • 2.4 示例流程(Windows 平台)​​
  • 三 总结

一 概念

  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++编译器的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈AI致幻

文章目录 当前形势下存在的AI幻觉(AI致幻)什么是AI幻觉AI幻觉的类型为什么AI会产生幻觉AI幻觉的危害与影响当前应对AI幻觉的技术与方法行业与学术界的最新进展未来挑战与展望结论 当前形势下存在的AI幻觉(AI致幻) 什么是AI幻觉 …

车载软件架构 --- 二级boot设计说明需求规范

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

Java高效合并Excel报表实战:GcExcel让数据处理更简单

前言:为什么需要自动化合并Excel? 在日常办公场景中,Excel报表合并是数据分析的基础操作。根据2023年企业办公效率报告显示: 财务人员平均每周花费6.2小时在Excel合并操作上人工合并的错误率高达15%90%的中大型企业已采用自动化…

第十四届蓝桥杯 2023 C/C++组 平方差

目录 题目: 题目描述: 题目链接: 思路: 核心思路: 第一种思路: 第二种思路: 坑点: 代码: 数学找规律 O(n) 50分代码详解: O(1)满分代码详解&#x…

I/O复用函数的使用——select

I/O复用函数的使用——select 目录 一、概念 二、select接口 2.1 基础概念 2.2 使用 select 函数的标准输入读取代码 2.3 基于 select 模型的多客户端 TCP 服务器实现 一、概念 i/o复用使得程序能同时监听多个文件描述符,可以提高程序性能。 之前为了让服务器能…

图像预处理-图像轮廓特征查找

其实就是外接轮廓,有了轮廓点就可以找到最上、最下、最左、最右的四个坐标(因为有xmin,xmax,ymin,ymax)。就可以绘制出矩形。 一.外接矩形 cv.boundingRect(轮廓点) - 返回x,y,w,h,传入一个轮廓的轮廓点,若有多个轮廓需…

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…

list的学习

list的介绍 list文档的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一…

HarmonyOS:Navigation实现导航之页面设置和路由操作

导读 设置标题栏模式设置菜单栏设置工具栏路由操作页面跳转页面返回页面替换页面删除移动页面参数获取路由拦截 子页面页面显示类型页面生命周期页面监听和查询 页面转场关闭转场自定义转场共享元素转场 跨包动态路由系统路由表自定义路由表 示例代码 Navigation组件适用于模块…

管道位移自动化监测方案

一、背景 管道系统在区域性地质沉降作用下易形成非均匀应力场集中现象,诱发管体屈曲变形及环焊缝界面剥离等连续损伤累积效应,进而导致管道力学性能退化与临界承载能力衰减。传统人工巡检受限于空间覆盖度不足及数据采集周期长(≥72h&#xf…

【学习笔记】机器学习(Machine Learning) | 第五周| 分类与逻辑回归

机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 一、逻辑回归的基本原理分类判断条件模型输出的解释Sigmoid 函数与 Logistic 函数逻辑…

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例 内容概要 第8章深入探讨了计算机视觉中的深度学习,特别是卷积神经网络(convnets)的应用。本章详细介绍了卷积层和池化层的工作原理、数据增强技术、预训练模型的特征…

[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue博物馆(预约)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue博物馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机科学技术的日渐成熟&#xff…

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键

机器视觉lcd屏增光片贴合应用

在现代显示制造领域,LCD屏增光片贴合工艺堪称显示效果的"画龙点睛"之笔。作为提升屏幕亮度、均匀度和色彩表现的关键光学组件,增光片的贴合精度直接影响着终端用户的视觉体验。传统人工贴合方式难以满足当前超窄边框、高分辨率显示屏的严苛要求…

VScode-py环境

settings.json {"git.ignoreLimitWarning": true,"code-runner.runInTerminal": true,"code-runner.executorMap": {"python": "python3"} } 第二句话保证在终端里面进行IO 第三句话保证python3的用户不会执行python关键…

用键盘实现控制小球上下移动——java的事件控制

本文分享Java的一个有趣小项目,实现用键盘控制小球的移动 涉及java知识点:Swing GUI框架,绘图机制,事件处理,焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…

《马尼拉》桌游期望计算器

《马尼拉》桌游期望计算器:做出最明智的决策 注:本项目仍在开发验证中,计算结果可能不够准确,欢迎游戏爱好者提供协助! 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用&#xff…

动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染

动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…

线程池的介绍

目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池,我们可能想到 常量池,可以先来说说常量池: 像是字符串常量,在Java程序最初构建的时候,就已经准备好了,等程…