当前位置: 首页 > article >正文

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

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

相关文章:

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

c 几个编译概念 一 概念二 层级关系总结2.1层级表格2.2 关键点说明2.3 示例流程(以 Ninja 为例)2.4 示例流程(Windows 平台)​​ 三 总结 一 概念 CMake 通过 CMakeLists.txt 生成不同平台的构建文件(如 .sln、build.n…...

创建 Node.js Playwright 项目:从零开始搭建自动化测试环境

一、环境准备 在开始创建 Playwright 项目之前,确保你的电脑上已经安装了以下工具: Node.js:Playwright 依赖于 Node.js 环境,确保你已经安装了最新版本的 Node.js。可以通过以下命令检查是否安装成功: node -v npm -…...

浅谈AI致幻

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

postman乘法计算,变量赋值

postman脚本怎么计算乘法 在Postman中,你可以通过多种方式计算乘法,这取决于你的具体需求。例如,如果你想在发送请求前计算乘法结果,或者在测试标签中计算响应数据的乘法,下面是一些常见的方法。 1. 使用JavaScript代…...

自定义错误码的必要性

为什么要使用错误码,直接返回一个错误信息不好么? 下面介绍一下,在程序开发中使用错误码的必要性~ 便于排查问题 想象你开了一家奶茶店,顾客下单后可能出现各种问题: 没珍珠了​​(错误码:50…...

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

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

管理杂谈——采石矶大捷的传奇与启示

南宋抗金史上,岳飞与岳家军的铁血传奇家喻户晓,但另一位力挽狂澜的“文官战神”却常被忽视——他从未掌兵,却在南宋存亡之际整合溃军,以少胜多,缔造采石矶大捷。此人正是虞允文。一介书生何以扭转乾坤?他的…...

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

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

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

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

前端路由缓存实现

vue3缓存实现完整版,查看这篇设计和实现方式吧,更完整...

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

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

ubuntu20.04安装安装x11vnc服务基于gdm3或lightdm这两种主流的显示管理器。

前言:在服务端安装vnc服务,可以方便的远程操作服务器,而不用非要插上显示器才行。所以在服务器上安装vnc是很重要的。在ubuntu20中,默认的显示管理器已经变为gdm3,它可以带来与 GNOME 无缝衔接的体验,强调功…...

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

其实就是外接轮廓,有了轮廓点就可以找到最上、最下、最左、最右的四个坐标(因为有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…...

AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析及使用建议

目录标题 Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析1. Tesseract类型: 开源 OCR 引擎特点:缺点:适用场景: 2. PaddleOCR (推荐)类型:特点:缺点:适用场景: 复杂版式文档、多语言混合文本、需要高精度识别的场景&#…...

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

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

悬停以及点击切换图片

为了实现悬停切换图片的功能,我们可以为每个按钮添加鼠标悬停事件监听器。以下是详细步骤和代码: 首先在控制器类中添加初始化方法,并添加事件监听器: package com.example.demo6;import javafx.event.ActionEvent; import java…...

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

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

Python基础总结(九)之推导式

文章目录 一、列表推导式1.1 列表推导式的格式1.2 列表推导式的注意事项1.3 列表推导式示例 二、 字典推导式2.1 字典推导式格式2.2 字典推导式注意事项2.3 字典推导式示例 三、 元组推导式3.1 元组推导式格式3.3 元组推导式示例 Python中的推导式有列表推导式,字典…...

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

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

基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发

基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发 前言:当Java开发遇上LLM编程困境 在LLM应用开发领域,Java开发者常面临两大痛点:一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件,二是复杂…...

制作一款打飞机游戏12:初稿原型

当前进展 ‌任务回顾‌:在之前,我们做了大量的规划和原型设计。我们创建了关卡,添加了侧向滚动和BOSS模式背景重复,还制作了一个紧凑的瓦片集。‌原型完成‌:我们完成了五个原型,基本实现了飞机飞行、滚动…...

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

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

位运算,状态压缩dp(算法竞赛进阶指南学习笔记)

目录 移位运算一些位运算的操作最短 Hamilton 路径(状态压缩dp模板,位运算) 0x是十六进制常数的开头;本身是声明进制,后面是对应具体的数; 数组初始化最大值时用0x3f赋值; 移位运算 左移 把二…...

极狐GitLab 项目 API 的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目 API 的速率限制 (BASIC SELF) 引入于 15.10 版本,功能标志为rate_limit_for_unauthenticated_projects_api_…...

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

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

VScode-py环境

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