浅谈开发环境

news/2025/3/5 7:43:18/

前言

工欲善其事,必先利其器。工作中经常用到的各种’东西’,如CMake、QMake、Make、MSBuildCLang、GCC、MinGW、MSVC等,有些在命名上有些类似,实际作用却不尽相同。

因此这里换个角度来了解下这些‘东西’的作用,以及这些‘东西’之间的联系。

组成

基于多年开发经验,这里将个人理解的开发环境划分成4个部分:
1

下面开始逐一介绍。

构建系统

构建系统,是构建系统生成器的简称,它读取CMakeList.txt中的指令,生成特定构建工具(例如 Make、Ninja、Visual Studio、Xcode)所需的构建文件(例如 Makefile、.sln、.xcodeproj)。

这里引出下面要介绍的构建工具

常见的不同平台的构建系统(构建系统生成器)有:
2

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 文件。

相当于是自带了构建系统、构建工具。扩展性较差,较为局限。

至此可以知道:构建系统(生成器)需要项目描述文件,并以此生成构建工具所需的构建文件。

构建工具

上面提到了构建系统(生成器)生成了各种构建文件,拿到构建文件后,构建工具就开始介入构建流程了。

构建工具,可以理解成自动化构建过程的工具,它们管理编译、链接、打包等步骤,并处理依赖关系。

常见的不同平台的构建工具有:
3

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。

至此可以知道:构建工具通过构建系统(生成器)生成的构建文件,开始自动化构建过程(编译、链接、打包、处理依赖等)

编译器

通过对构建工具的介绍,这里可以知道编译是构建中的一环,大致流程如下:
4

此外的预处理器、链接器等因篇幅有限不再过多介绍。

常见的不同平台的编译器如下:
5

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)是一种软件应用程序,它为程序员提供了一个统一的、多功能的平台,用于软件开发的各个阶段,从编写代码、调试到测试和部署。

常见的集成开发环境有:
6

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


http://www.ppmy.cn/news/1576767.html

相关文章

Jasypt 与 Spring Boot 集成文档

Jasypt 与 Spring Boot 集成文档 目录 简介版本说明快速开始 添加依赖配置加密密钥加密配置文件 高级配置 自定义加密算法多环境配置 最佳实践常见问题参考资料 简介 Jasypt 是一个简单易用的 Java 加密库,支持与 Spring Boot 无缝集成。通过 Jasypt,…

【PyQt5项目实战分享】基于YOLOv5的交通道路目标检测和数据分析软件

这是我之前用PyQt5做的一个基于YOLOv5的交通目标检测软件,包括物体检测和相关数据的分析功能,最近将其完善了下并打包,希望对大家有所帮助~ Tips:文末有我放到 github 和 gitee 的项目开源地址哦 文章目录 ⭐项目功能交通物体检测…

利用Python爬取中国气象局天气预报数据

利用Python爬取中国气象局天气预报数据 在这篇博客中,我们将介绍一段使用Python编写的代码,它能够从中国气象局的网站上爬取天气预报数据,并将这些数据存储到数据库中。这段代码不仅展示了如何利用Python进行网页数据抓取,还涉及到数据处理和数据库操作等多方面的知识。 …

微信小程序中配置不同的环境变量,并依据环境变量编写API接口请求文件

在微信小程序中,为了在不同环境(如开发、测试、生产)下使用不同的 API 接口地址,我们可以通过配置环境变量来实现。以下是具体的实现步骤和示例代码: 1. 创建环境配置文件 在项目根目录下创建一个 env.js 文件&#…

Git强制覆盖分支:将任意分支完全恢复为main分支内容

Git强制覆盖分支:将任意分支完全恢复为main分支内容 场景背景完整操作步骤一、前置准备二、操作流程步骤 1:更新本地 main 分支步骤 2:强制重置目标分支步骤 3:强制推送至远程仓库 三、操作示意图 关键风险提示(必读&a…

深入浅出C语言:第一步,理解 Hello World!

深入浅出C语言&#xff1a;第一步&#xff0c;理解 “Hello World!” 一、程序结构解析 “Hello World!” 程序虽然简短&#xff0c;但它包含了C语言程序的基本结构。 下面是这个程序的代码&#xff1a; #include <stdio.h>int main() { printf("Hello World…

comfyui使用ComfyUI-AnimateDiff-Evolved, ComfyUI-Advanced-ControlNet节点报错解决

comfyui使用animate-diff生成动画&#xff0c;各种报错解决 报错1&#xff1a; ‘cond_obj’ object has no attribute ‘hooks’ 报错2&#xff1a; AdvancedControlBase.get_control_inject() takes 5 positional arguments but 6 were given 报错3&#xff1a; ‘ControlN…

二叉树迭代遍历(三种写法)

写法一&#xff08;各个步骤分离&#xff09; 前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list new ArrayList<>();//迭代算法preorderStack(root, list);return list;} //通过栈的先进后出特性&am…