关于编译的重要概念总结

文章目录

    • 什么是GNU
    • 什么是GCC / G++
      • gcc / g++
      • 编译的四个阶段
      • gcc和g++的主要区别
    • MinGW-w64
    • C++语言版本
      • C++ 98
      • C++ 11
      • C++ 14
      • C++ 17
      • C++ 20
    • Makefile
    • cmake

回想初学编程的时候,大部分人都是从C语言开始学起的,除了一些常见的语法和思想,一些基础知识常常被人们忽略,如果没有及时地进行梳理,可能短时间内没有太大的影响,但是在日后碰到这些问题时仍旧一头雾水。例如C语言是一门编译型语言,编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。对于编译型语言,绕不过的就是编译器。

下面提出几个问题,不妨思考一下:

  • 什么是GNU

  • 什么是GCC / G++

  • 什么是MinGW-w64

  • C++ 标准有哪些?主要区别是什么?

  • Makefile是什么?cmake是什么?

如果脑海中没有一个整体的概念框架的话,正如那张图,一个全副武装的骑士,虽然防护的很好,但是对于编译器的基础知识掌握的不牢,就像头盔上的一个缝隙,可能下一箭正中缝隙,败下阵来。

下面具体介绍这几个概念:

什么是GNU

GNU 是一个计划或者叫运动。在这个旗帜下成立了 FSF,起草了 GPL 等。

GNU操作系统是一种由自由软件构成的类 Unix 操作系统,该系统基于 Linux 内核,目标在于建立一个完全相容于UNIX的自由软件环境。

当时Unix 系统开始收费和商业闭源了。针对这一现象,Richard Stallman发起了 GNU 计划,模仿 Unix 的界面和使用方式,从头做一个开源的版本。他自己做了编辑器 Emacs 和编译器 GCC。接下来开发者实现了包括核心的 gcc 和 glibc。但是 GNU 系统缺少操作系统内核。原定的内核叫 HURD,一直完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。这时 Linus 为了在 PC 上运行 Unix,在 Minix 的启发下,开发了Linux。当然 Linux 只是一个系统内核,系统启动之后使用的仍然是 gcc 和 bash 等软件。Linus 在发布 Linux 的时候选择了 GPL,因此符合 GNU 的宗旨。也弥补了GNU在这方面的缺少,于是合在一起打包发布叫 GNU / Linux。然后省掉了前面部分,变成了 Linux 系统。实际上 Debian,RedHat 等 Linux 发行版中内核只占了很小一部分容量。

参考:https://www.gnu.org/gnu/gnu-linux-faq.html

什么是GCC / G++

GCC(GNU编译器套件):GNU Compiler Collection。可以编译C、C++、JAVA、Fortran、Pascal、Object-C、Ada等语言。

gcc / g++

gcc是GCC中的GNU C Compiler(C 编译器

g++是GCC中的GNU C++ Compiler(C++编译器

编译的四个阶段

在具体的编译过程中,主要分为四个阶段:

  1. cpp(预处理器):c语言pre-proccessor。头文件展开,宏替换,注释去掉。hello.c变成hello.i

  2. ccl(编译器):c语言compile。C文件变成汇编文件:hello.i变成hello.s

  3. as(汇编器):assembler。汇编文件变成可执行的二进制文件:hello.s变成hello.o

  4. ld(链接器):GNU Linker,loader。将函数库中相应的代码组合到目标文件中,汇编文件和系统库文件链接起来,生成在特定平台可执行的程序。

最早的操作系统中,是没有链接器的,由加载器loader进行工作,所以ld的命名由此而来。

gcc调用了C compiler,而g++调用了C++ compiler

gcc和g++的主要区别

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)

  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译

  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL

  4. gcc在编译C文件时,可使用的预定义宏是比较少的

  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。

  6. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个

这里强推《深入理解计算机系统》,CSAPP这本书上讲解的非常详细。

参考:GCC的gcc和g++区别 - samewang - 博客园

MinGW-w64

MinGW 的全称是:Minimalist GNU on Windows 。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。简单来说,MinGW 就是 GCC 的 Windows 版本。

MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成32位可执行程序,而 MinGW-w64 则可以编译生成 64位 或 32位 可执行程序。目前,MinGW 现已被 MinGW-w64 所取代,且 MinGW 也早已停止了更新。

MinGW-w64 是开源软件,可以免费使用。使用 Windows 的C语言运行库,因此编译出的程序不需要第三方 DLL ,可以直接在 Windows 下运行。 那些著名的开源 IDE 实际只是将 MinGW-w64 封装了起来,使它拥有友好的图形化界面,简化了操作,但内部核心仍然是 MinGW-w64。

C++语言版本

C++是一门以C为基础发展而来的一门面向对象的高级程序设计语言,从1983年由Bjarne Stroustrup教授在贝尔实验室创立开始至今,已有30多个年头。C++从最初的C with class,经历了从C++98、C++ 03、C++ 11、C++ 14、C++17再到C++ 20多次标准化改造,功能得到了极大的丰富,已经演变为一门集面向过程、面向对象、函数式、泛型和元编程等多种编程范式的复杂编程语言。

年份C++ 标准名称非正式名称
1998ISO/IEC 14882:1998C++98
2003ISO/IEC 14882:2003C++03
2011ISO/IEC 14882:2011C++11
2014ISO/IEC 14882:2014C++14
2017ISO/IEC 14882:2017C++17
2020ISO/IEC 14882:2020C++20

C++ 98

C++从最初的C with Classes新增了很多其他的特性,比如异常处理、模板、标准模板库(STL)、运行时异常处理(RTTI)与名字空间(Namespace)等。C++ 03 通常被认为是98的补丁。

C++ 11

C++引入了对象移动右值引用lamba表达式(函数式编程)、编译时类型识别(auto)、别名模板以及很多新型关键词(如nullptr、decltype、constexpr)等现代编程语言常具备的能力,让C++与时俱进,开发效率得到了很大的提升。这些新的特性随着C++11标准的发布而被正式确立下来。C++ 11版本也被称为现代C++,而C++ 98/03版本也被称为传统C++。此外还有long long的基本类型。新增容器std::unordered_map/std::unordered_multimap、std::unordered_set/std::unordered_multiset 等。

C++ 14

C++14引入了二进制文字常量、将类型推导从Lambda函数扩展到所有函数、变量模板以及数字分位符等。进一步补充优化C++11。

C++ 17

到了2017年,C++迎来了C++17标准。此次对C++的改进和扩增,让C++变得更加容易接受和便于使用了。C++17引入了许多新的特性,比如类模板参数推导、UTF-8文字常量、fold表达式、新类型以及新的库函数等。

C++ 20

C++20 的 Big Four(四大新特性:概念、范围、协程和模块)以及核心语言(包括一些新的运算符和指示符)。

参考文章:C++版本发展史_c++历史版本_蓬莱道人的博客-CSDN博客

Makefile

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile在绝大多数的IDE 开发环境中都在使用,譬如 Visual C++的 nmake、linux 下的 GNU make、Qt 的 qmake 等等。

cmake

不同的IDE所集成的make工具所遵循的规范和标准都不同,也就导致其语法、格式不同,也就不能很好的跨平台编译,会使得工作繁琐。那么cmake为了解决这个问题而诞生了,其允许开发者指定整个工程的编译流程,在根据编译平台,生成本地化的Makefile和工程文件,最后用户只需make编译即可。简而言之,可以把cmake看成一款自动生成 Makefile 的工具,所以编译流程就变成了:cmake—>make–>用户代码–>可执行文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次从JS到内网的横向案例

前言 前段时间参加了一场攻防演练,使用常规漏洞尝试未果后,想到不少师傅分享过从JS中寻找突破的文章,于是硬着头皮刚起了JS,最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。 声明:本次演练中&#xf…

ROS学习第二十四节——rosbag

1 rosbag使用_命令行 需求: ROS 内置的乌龟案例并操作,操作过程中使用 rosbag 录制,录制结束后,实现重放 实现: 1.准备 创建目录保存录制的文件 mkdir ./xxx cd xxx2.开始录制 -a:all,录制所有话题消息 -o:out&#xff0c…

Linux基础—网络设置

Linux基础—网络设置 一、查看网络配置1.查看网络接口信息 ifconfig2.查看主机名称 hostname3.查看路由表条目 route4.查看网络连接情况 netstat5.获取socket统计信息 ss 二、测试网络连接1.测试网络连接 ping2.跟踪数据包 traceroute3.域名解析 nslookup 三、使用网络配置命令…

智慧养老平台建设方案word

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 1、 总体设计 1.1 建设原则 养老机构智能化管理工程是一项涉及多学科知识的复杂的系统工程,养老机构智能化管理围绕机构发展战略,立足机构需求&…

【python中的多线程了解一下?】

基本说明 线程(Thread)是操作系统进行调度的最小单位,是进程中的一个独立执行单元。线程与进程相比,具有更轻量级、更高效率、更易调度、共享资源等优点。 在传统的单核CPU中,操作系统通过时间片轮转算法将CPU的时间…

阿里版 ChatGPT 突然上线!

转自:纯洁的微笑 其实早本月初,就传出过不少阿里要推出类ChatGPT的消息。 前几天率先流出的天猫精灵“鸟鸟分鸟”脱口秀版GPT,就是基于大模型的“压缩版”,已经以其惊艳表现吸引了众目光。 如今“原版大菜”上桌,自然一点即着&a…

实验设备管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87682549 更多系统资源库…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤: 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的,拟合方程是2阶的数据是4阶的,拟合方程也是4阶…

可配置物料-文章资料分享

可配置物料项目一般很少用到,用到就是要命,推荐一下之前查资料收集的资料,分享给大家。感谢这位大佬收集的文章! Variant Configuration (LO-VC) - Product Lifecycle Management - Support Wikihttps://archive.sap.com/document…

研报精选230419

目录 【行业230419东吴证券】AACR2023本土药企临床进展:“秒懂”全球创新药系列研究之会议追踪 【行业230419浙商证券】大制造行业估值手册:周度数据跟踪 【行业230419东方财富证券】2023上海车展前瞻:自主争先,迎接智能电动新时代…

Linux网络服务之DHCP篇

目录 一、了解DHCP服务1.1DHCP定义1.2DHCP好处1.3DHCP的分配方式 二、DHCP工作过程三. 使用DHCP动态配置主机地址 一、了解DHCP服务 1.1DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登…

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 3. MyCat3.1 概述 1. 介绍 采用单数据库进行数据存储存在以下瓶颈: IO瓶颈:热点数据太多&#x…

java IO流_1

目录 分类 字节流 InputStream OutputStream 文件拷贝 字符流 FileReader FileWriter 处理流 BufferedReader BufferedWriter 文本拷贝 流是从起源到接受的有序数据,通过流的方式允许程序使用相同的方式来访问不同的输入/输出源。 分类 按数据…

4.26和4.27、selectAPI介绍(4.27、select代码)

4.26和4.27、selectAPI介绍(4.27、select代码) 1.selectAPI介绍①select多路复用流程图②select多路复用缺点 2.select代码使用介绍3.select代码实现①select服务端实现②select客户端实现 1.selectAPI介绍 主旨思想: 首先要构造一个关于文件…

echarts中横坐标显示为time,使用手册

需求: 后端传递(两段数据,不同时间间隔)的24h实时数据,前端需要根据24小时时间展示,要求:x轴为0-24h,每个两小时一个刻度 误区: 刚开始通过二维数据的形式秒点&#xff…

MySQL数据库从入门到精通学习第2天(创建数据库)

创建数据库 通过CREATE DATABASE语句来创建数据库通过CREATE SCHEMA语句来创建数据库通过IF NOT EXISTS进行判断创建 通过CREATE DATABASE语句来创建数据库 创建数据库的语法格式如下: CREATE DATABASE 【数据库名】; 创建数据库的库名跟标识符一样也是有要求的&…

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状…

android sdl编译

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台。 1 下载SDL源码 http://www.libsd…

这篇把「精准测试」算是讲明白了

作为测试同学,我们经常在工作中会有这样的困惑:我写的用例真的有效且全面吗,我的测试真的做到有效覆盖了吗?回归阶段我到底需要回归什么,回归验证充分吗?这次的改动到底影响范围有多大?针对以上…

从编译器角度理解C++编译和连接原理

C编译链接整体介绍 链接主要工作 1 所有.o文件段的合并,符号表合并后,进行符号解析 链接时就是在符号表中找对应的符号是否只出现于.text或.data段一次,若一次都无,则符号未定义;若出现多次,符号重定义 符…
最新文章