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

news2024/12/27 13:58:38

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开始在磁盘上,然后被复制到主存,最后从主存上复制到显示设备。

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

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

相关文章

mongodb设置用户名和密码

docker run --name mongodb -p 27017:27017 -v /opt/mongodb/data:/data/db -v /opt/mongodb/backup:/data/backup -d mongo --auth进入容器&#xff1a; docker -it exec 容器id /bin/bash进入mongo的控制台 mongosh设置用户名及密码 use admin db.createUser({ user: &…

dwg格式转换pdf,教大家几个简单方法

dwg格式转换pdf&#xff0c;今天教大家几个简单方法吧。因为有很多小伙伴私信小编&#xff0c;询问关于CAD格式转换的问题。我们知道&#xff0c;dwg是CAD格式的一种&#xff0c;只能使用CAD软件进行打开&#xff0c;这非常不方便。特别是在需要在手机或其他平台查看时&#xf…

IT项目管理小题计算总结【太原理工大学】

计算题小题应该就这些了吧&#xff0c;祝大家都高过&#xff01;>_< 目录 1. 求投资回收期 2. 求投资收益率 3. 求功能点 4. 成本预期值 5. 成本加固定 6. 期望时间及概率 7. 项目进度计算 8. 完工尚需估算 9. 合格率计算 10. 合同总价 11. 压缩工期 1. 求投资…

Hugging Face Transformers Agent

&#x1f917;Hugging Face Transformers Agent 就在两天前&#xff0c;&#x1f917;Hugging Face 发布了 Transformers Agent——一种利用自然语言从精选工具集合中选择工具并完成各种任务的代理。听着是不是似曾相识&#xff1f; 没错&#xff0c;Hugging Face Transformer…

APP软件的测试方法和工具

手机APP的使用已经非常普及&#xff0c;使用方便&#xff0c;因此越来越多的企业通过APP对外管理客户及产品&#xff0c;对内管理工作流程。这些APP有的是自研&#xff0c;有的是找专业的APP外包公司开发完成&#xff0c;开发完成后需要做详细的测试&#xff0c;今天和大家分享…

java版企业电子招投标系统源码 招采系统源码 spring boot+mybatis+前后端分离实现电子招投标系统

spring bootmybatis前后端分离实现电子招投标系统 电子招投标系统解决方案 招标面向的对象为供应商库中所有符合招标要求的供应商&#xff0c;当库中的供应商有一定积累的时候&#xff0c;会节省大量引入新供应商的时间。系统自动从供应商库中筛选符合招标要求的供应商&#x…

干货!12个程序员证书​,含金量超高

近来IT行业成为了发展前景好高薪资的大热门&#xff0c;越来越多的人选择参加各种各样的计算机考试&#xff0c;就是为了拿含金量高的证书&#xff0c;提升自己的职场竞争力。 那么程序员有哪些含金量高的证书可以考&#xff1f;下面云学姐将详细介绍一下含金量高的IT证书&…

游戏网站JS加密限制,用python来突破限制,进行逆向解密~

回来了回来了 好久没更新了 不过好像没啥人看文章了 难不成都去看视频学习了吗 今天线的无聊来分享分享如果用python来突破JS加密限制&#xff0c;进行逆向解密&#xff0c;来实现自动登录~ 逆向目标 目标&#xff1a;某 7 网游登录主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29…

【pytest】执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环境等等&#xff0c;并且在DevOps理念中&#xff0c;往往自动化都会与Jenkins进行CI/CD&#xff0c;不论是定时执行策略…

深度解析Linux kernel同步机制(上篇)

在现代操作系统里&#xff0c;同一时间可能有多个内核执行流在执行&#xff0c;因此内核其实像多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问&#xff0c;尤其是在多处理器系统上&#xff0c;更需要一些同步机制来同步不同处理器上的执行单元对共享…

开源之夏 2023 | 欢迎报名openEuler sig-eBPF开发任务

开源之夏是中国科学院软件研究所联合openEuler发起的开源软件供应链点亮计划系列暑期活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区&#xff0c;针对重要开源软件的开发与维护提供项目&#x…

Windows版Sketch软件也太好用了吧!

目前为止&#xff0c;Sketch 软件仅支持 macOS 系统&#xff0c;没有推出 Windows 版本&#xff0c;而且在短期内也不太可能推出。这是因为 Sketch 软件是使用独有的 OS X 技术和框架开发的&#xff0c;它依赖于许多 OS X 的核心功能&#xff0c;这些功能不容易轻松移植到其他操…

[MYAQL / Mariadb] 数据库学习-管理表记录2:匹配条件

管理表记录-匹配条件 匹配条件基本条件查询逻辑匹配&#xff08;多个条件判断&#xff09; 高级条件范围匹配模糊查询正则表达式&#xff1a; regexp四则运算 操作查询结果&#xff08;对查找到的数据再做处理&#xff09;排序分组&#xff08;一样的显示一次&#xff09;&…

FreeRTOS_系统配置

目录 1. FreeRTOSConfig.h 文件 2. "INCLUDE_" 开始的宏 2.1 INCLUDE_xSemaphoreGetMutexHolder 2.2 INCLUDE_xTaskAbortDelay 2.3 INCLUDE_vTaskDelay 2.4 INCLUDE_vTaskDelayUntil 2.5 INCLUDE_vTaskDelete 2.6 INCLUDE_xTaskGetCurrentTaskHandle 2.7 IN…

数据结构与算法(二)

一、数组 什么是数组&#xff1f; 数组&#xff1a;在内存中用一串连续的区域来存放一些值。数组是相同类型数据元素的有序集合 数组是由相同类型的元素的集合组成的数据结构 连续内存&#xff1a;JS的数组元素可以是任意类型&#xff0c;JS中的内存地址是不连续的 数组的…

工业互联网的新应用:高端装备的故障预测和健康管理

高端装备制造行业作为我国战略性新兴产业的重要组成部分&#xff0c;面临着产品复杂和生命周期长的挑战。为了提高装备的可靠性、可用性和维护效率&#xff0c;工业互联网技术在高端装备的故障预测和健康管理方面发挥了重要作用。 本文将探讨工业互联网在高端装备中故障预测和…

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义&#xff1a; 结构化表达&#xff1a;是基于结构化思维&#xff0c;理清事物整理与部分之间关系、换位思考后&#xff0c;进行简洁、清晰和有信服力的表达&#xff0c;是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…

度娘教我influxdb,先搞一波在补理论

InfluxDb中的数据查询语法where子句 公司用的时序性数据库是influxdb&#xff0c;但是确实接触有点少。 心里话&#xff1a; 就是没接触过&#xff0c;度娘教教我。。。。 我咋回呢&#xff0c;现学吧&#xff0c;都是数据库&#xff0c;天下乌鸦一般黑然后就哟了以下&#xf…

Mac 更换.gradle文件目录

用mac开发最大滑铁卢居然是存储空间不足......于是加了一个外置的存储器。于是需要把android开发中最大的一个缓存目录移到外置存储器... 一开始对android studio的进行了如下设置 于是乎...Mac用户下的.gradle全删了...这个时候用android studio打包运行都没问题了。 如果你…

AI在视频教学方面会有哪些有意思应用?

阿酷TONY / 原创 / 2023-5-17 / 长沙 来&#xff0c;我们一起来探索未来式的学习体验&#xff0c;AI视频&#xff0c;AI与视频的应用将为你带来前所未有的教学体验。AI在视频教学方面的应用&#xff0c;主要会体现在如下几个方面&#xff1a; 1. AI 课程知识点梳理 2. AI 学…