makefile 学习(1):C/C++ 编译过程

1. GCC 介绍

1.1 介绍

GCC 官方文档 https://gcc.gnu.org/onlinedocs/

  • 官方文档是最权威的,网上所有的答案都来自官方文档
  • 国内论坛参差不齐,找到好的答案比较花时间,并且很容易被错误的文档误导。所以推荐看官方文档靠谱点,并且可以提升英语阅读能力

GCC(GNU Compiler Collection) GNU编译程序集合, 其他所有开放源码软件都在某种程度上依赖于它,甚至其他语言,例如Python都是由C语言开发,由GNU编译程序编译的。

1.2 GCC常见的组成部分

GCC是由很多组件组成的,常见的组成部分如下:

  • c++: 它是gcc的一个版本,默认语言设置为C++,而且在连接的时候自动包含标注C++库,这和g++一样。(c++与g++组件功能基本上一样的,我们更常用g++
  • configure: GCC源代码根目录中的一个脚本,用于设置配置值和创建GCC编译程序必须的make程序文件
  • gcc: 主要用来编译C语言程序,该驱动程序等同于执行编译程序和连接程序以产生需要的输出
  • g++: gcc的一个版本,默认语言设置为C++,而且在链接的时候自动包含标准的C++库,这和c++一样
  • libgcc: 该库包含的例程作为编译程序的一部分,是因为他们可被链接到实际的可执行程序中,它们是特殊的例程,链接到可执行程序,来执行基本的任务,例如浮点运算,这些库中的例程通常都是平台相关的
  • libstdc++:运行时库(动态库),包含定义为标准语言一部分的所有C++类和函数

1.3 GCC包含的常见软件

下面介绍的GCC常见软件,每一个软件和程序的编译和运行是密切相关的

  • ar: 这是一个程序,可通过从文档中增加、删除和析取文件来维护库文件。通过使用该工具是为了创建和管理连接程序使用的目标库文档。该程序是binutils包的一部分。
  • as: GNU的汇编器,它可以被编译或能够在各种不同平台上工作。
  • gdb: GNU的调试器 ,不管是用vscode 还是vs2015,在debug c++程序时,底层都是调用GNU调试器来执行调试任务。
  • gprof: 该程序会监督编译程序的执行过程,并报告程序中各个函数的运行时间,可以根据所提供的配置文件来优化程序。(在实际工作中,接触会比较少)
  • ld: GNU的连接程序,利用该程序将目标文件链接为可执行程序或者库文件(实际工作中用的非常多)
  • libtool: 一个基本库,支持make程序的描述文件使用的简化共享库用法的脚本。
  • make: 一个工具程序,它会读makefile脚本来确定程序的哪个部分需要编译和链接,然后发布必要的命令。它读的脚本(叫做makefile或者Makefile)定义了文件关系和依赖关系, 执行make进行自动批量编译程序,解放我们的双手。

1.4 GCC默认头文件搜索路径

  • 头文件对于编译来说是非常重要的,在编译程序时候,一定要把需要依赖的头文件的搜索路径都要Include进来。
  • 在github中下载一些项目上,经常会遇到一些非常头疼的问题。会经常报错显示找不到xx头文件, 在学会makefile编写后,相信遇到这样的问题,可以轻松的去解决。
  • 可以通过下面的命令来查看GCC默认的头文件搜索路径
echo | gcc -v -x c -E -
 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

在这里插入图片描述

2. 编译过程

2.1 hello world 在计算机中的表示

hello程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编译器创建并保存的文本文件,文件名为hello.c

源程序其实是由值0和1组成的位(又称为比特)序列。8个位被组织成一组,称为字节,每个字节表示程序中的某些文件字符。

一般.c后缀的是c语言脚本文件,.cpp后缀的是c++语言的脚本文件。但是在linux系统中,其实是不分文件后缀的,对它来说一个文件就是一串比特,没有任何别的意义,加后缀主要是使用者的习惯,为了更加方便的辨别是哪种语言编写的文件,对计算机来说是没有区别的。

大部分计算机使用ASCII标准来表示文本字符

  • 用一个唯一的单字节大小的整数值信息来表示每个字符
  • hello.c程序是以字节序列的方式存储在文件中的

hello.c 的表示方法说明了一个基本思想:系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的

在这里插入图片描述

2.2 编译过程 程

  • 程序的生命周期是从一个高级的C/C++语言程序开始的。

  • 为了在系统中运行程序,以c语言的hello.c来说,每条C语句必须被底层程序转化为一系列低级的机器语言指令(010101的格式)。

  • 然后这些指令按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来,目标程序也称为可执行目标文件。

  • GCC编译器读取程序文件hello.c, 并把它翻译成一个可执行目标文件hello, 这个编译过程可分为四个阶段完成,如下图所示,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统(compilation system)。

【图】

2.2.1 预处理阶段

预处理器(cpp) 根据以字符#开头的命令(头文件), 修改原始的C程序。比如hello.c中第一行的#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h中的内容,并把它直接插入到程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名。

2.2.2 编译阶段

编译器(ccl) 将文本文件hello.i翻译成文本文件hello.s, 它是一个汇编语言程序,该汇编程序对函数main的定义,如下所示:

						main:
						subq   $8, %rsp
						mov1   $.LCO,%edi
						call   puts
						mov1   $0,%eax
						addq   $8,%rsp
						ret

每条语句都以一种文本格式描述了一条低级机器语言指令。汇编语言非常有用,它为不同高级语言的不同编译器提供了通用的输出语言

2.2.3 汇编阶段

汇编器(as): 将hello.s编译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocation object program)的格式,并将结果保存在目标文件的hello.o中,

hello.o文件是一个二进制文件,它包含17个字节是函数main的指令编码。如果我们在文本编辑器中打开hello.o,将看到一堆乱码

2.2.4 链接阶段

注意,hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中

连接器(ld) 就负责处理这种合并,并输出可执行文件hello文件,可以被加载到内存中,有系统执行。

3. 程序在计算机内的存储

系统会花费大量的时间和步骤把信息从一个地方挪到另一个地方:

  • hello 程序的机器指令最初是放在磁盘上的
  • 当程序加载时,他们被复制到主存
  • 当处理器运行程序时,指令又从主存中复制到处理器中

相似地,数据串hello world\n开始在磁盘上,然后被复制到主存,最后从主存上复制到显示设备。

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

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

相关文章

二、数据字典开发

文章目录 二、数据字典开发1、搭建service-cmn模块1.1 搭建service-cmn模块1.2 修改配置1.3 启动类 2、数据字典列表2.1 数据字典列表接口2.1.1 model模块添加数据字典实体2.1.2 添加数据字典mapper2.1.4 添加数据字典controller 2.2 数据字典列表前端2.2.1 添加路由2.2.2 定义…

【Java算法题】剑指offer_01数据结构

前言 刷题链接&#xff1a; https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 1. 链表 JZ24 反转链表 思路&#xff1a;基本操作&#xff0c;如下所示。 /* public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} }…

ad18学习笔记一

如何自学altium designer如何自学altium designer&#xff1f; - 知乎如何自学altium designer 这里面有ad官方推荐的b站的视频&#xff1a;可以直接去b站关注ad官方账号 AltiumChina&#xff0c;它本身就发布了很多实用教程。 在知乎的这个界面也有Altium Designer Ver18_官…

c++ 11标准模板(STL) std::set(六)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

如何使用SCQA模型提高表达能力

SCQA架构是“结构化表达”工具。 一、什么是“SCQA架构”&#xff1f;‍ S&#xff08;Situation&#xff09;情景——由熟悉的情境或事实引入 C&#xff08;Complication&#xff09;冲突——指出实际面临的困境或冲突 Q&#xff08;Question&#xff09;疑问——你如何分析…

文本三剑客正则表达式3

文章目录 文本三剑客&正则表达式31 awk工作原理2 awk的基本格式及其内置变量2.1 基本格式2.2 内置变量2.3 示例2.3.1 直接打印所有内容2.3.2 取每一行的第一列2.3.3 打印行号&#xff0c;及所有内容2.3.4 打印第三行2.3.5 打印2-4行2.3.6 打印第2行和第4行2.3.7 用正则表达…

基于harbor安装私有镜像仓库

目录 Harbor介绍 Harbor安装 下载完成后&#xff0c;在压缩包解压到/usr/local目录下&#xff1a; 修改Harbor配置文件 推送本地镜像到harbor上 1、给本地镜像打一个标签 2、 设置docker的daemon.json 3、重启docker 4、使用docker登录harbor 5、把本地的镜像push到harbor…

银豆信息张雪灿:钻石级合作伙伴的增长秘诀

编者按&#xff1a; 杭州银豆信息技术有限公司&#xff08;简称“银豆”&#xff09;&#xff0c;是一家专注于云计算服务的高科技企业&#xff0c;目前已为2000家企业级客户提供了专业的行业解决方案, 与人民网、光大银行、长安汽车金融、vivo金融、浙江省农科院、淄博市大数…

MediaPipe虹膜检测:实时虹膜跟踪和深度估计

包括计算摄影(例如,人像模式和闪光反射)和增强现实效果(例如,虚拟化身)在内的大量实际应用都依赖于通过跟踪虹膜来估计眼睛位置。一旦获得了准确的光圈跟踪,我们就可以确定从相机到用户的公制距离,而无需使用专用的深度传感器。反过来,这可以改善各种用例,从计算摄影…

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

系类文章目录 机器学习算法——KD树算法介绍以及案例介绍 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 一、SVM支持向量机介绍 1.1、SVM介绍 1.2、几种核函数简介 a、sigmoid核函数 b、非线性SVM与核函…

从内网护卫到零信任尖兵:腾讯iOA炼成记

腾讯既是企业产品的服务商又是使用者&#xff0c;很多产品最原始的出发点最早只是为了解决腾讯自身某一个需求&#xff0c;经过不断地发展完善和业务场景锤炼&#xff0c;最终进化成一个成熟的企服产品。本系列文章讲述的是这样一组Made in Tencent故事&#xff0c;这是系列的第…

Word批量更改图片环绕方式与=尺寸大小

前提&#xff1a;一份Word文档里面有100张图片&#xff0c;有大有小&#xff0c;需要将100张图片更改为统一大小&#xff0c;宽度与高度均为5厘米&#xff0c;同时环绕方式也需要改成四周型。 默认Word图片的默认环绕方式为嵌入型&#xff0c;需要统一更改为四周型&#xff0c;…

linux 安装 maven 3.8 版本

文章目录 1&#xff1a;maven 仓库官网 2、下载安装包 3、使用&#xff1a;Xftp 上传到你想放的目录 4、解压文件 ​编辑 5、配置环境变量 ​编辑 6、刷新 /etc/profile 文件 7、查看maven 版本 1&#xff1a;maven 仓库官网 Maven – Download Apache Mavenhttps://mave…

Java 基础进阶篇(十五):IO 流总结(全网最全面)

文章目录 前置内容&#xff1a;字符集一、IO 流概述二、字节流2.1 文件字节输入流 FileInputStream2.1.1 案例&#xff1a;每次读取一个字节2.1.2 案例&#xff1a;每次读取一个字节数组2.1.3 案例&#xff1a;读取文件的全部字节 2.2 文件字节输出流 FileOutputStream2.3 文件…

使用Docker Dockerfile构建php LNMP集成开发环境,并运行Thinkphp5

宿主机环境 系统&#xff1a;MAC、Windows10 Docker版本&#xff1a;Docker version 23.0.5 Docker Desktop:Dockerdesktop官方地址 前言 这篇主要介绍如何在Mac、Windows10使用docker搭建LNMP集成开发环境。下面我会写Dockerfile编译安装Nginxphp基础环境。mysql、redis基…

pynvme操作流程

如下操作pynvme运行在fedora上&#xff0c;在其他操作系统尚未做尝试。 步骤一&#xff1a;检查本地windows是否安装ssh 检查方式&#xff1a;windows本地打开windows powershell&#xff0c;输入ssh&#xff0c;若打印usage &#xff1a;ssh等一些信息&#xff0c;则已安装s…

8.防火墙

文章目录 防火墙iptables防火墙介绍基础操作高级操作通用匹配隐含匹配端口匹配&#xff1a;--sport 源端口、--dport 目的端口 TCP标志位匹配&#xff1a;--tcp-flags TCP标志位ICMP类型匹配&#xff1a;--icmp-type ICMP类型 显式匹配多端口匹配IP范围匹配&#xff1a;-m ipra…

基于αβ剪枝算法的五子棋

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 五子棋是世界智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏&#xff0c;是世界智力运动会竞技项目之一&#xff0c;通常双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xf…

记录:自回归 模型在记忆 全随机序列 的潜变量 统计量爆炸现象

只是一个记录 8层12头512维度的 GPT 模型&#xff0c;使用它来记忆 10000 条 512长度 的无序序列&#xff0c;vocab_size 为100。 模型要自回归生成这些序列&#xff0c;不可能依赖局部推理&#xff0c;必须依赖全局视野&#xff0c;即记住前面的序列。 然后统计 最后一个no…

EasyRecovery16电脑硬盘数据恢复软件功能讲解

硬盘是很常见的存储数据的设备&#xff0c;硬盘中很多重要的数据一旦丢失会很麻烦&#xff0c;不过现在有硬盘数据恢复软件可以自行在家恢复数据。今天的文章就带大家来看看硬盘恢复数据的软件EasyRecovery。 EasyRecovery 是一款专业的数据恢复软件&#xff0c;支持恢复不同存…