Linux系统应用(5)——编译器gcc

2024-09-07 15:28

本文主要是介绍Linux系统应用(5)——编译器gcc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人内容简介:

🍃个人主页:诉清风2023

🎈逆转时间的公式,就是珍惜现在ദ്ദി˶ー̀֊ー́ ) ✧


目录

个人内容简介:

🎈逆转时间的公式,就是珍惜现在ദ്ദി˶ー̀֊ー́ ) ✧

前言

1、预处理

2、编译

3、汇编

4、链接

5、gcc选项

6、函数库

6.1 静态库

6.2 动态库

结语


前言

重点

在软件开发的过程中,从源代码到可执行程序的转变是一个复杂且有序的过程,通常包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)几个阶段

注意

这部分内容并没有难度,只需要理解和会使用即可


1、预处理

补充:gcc格式

gcc [选项] 要编译的文件 [选项] [目标文件]

预处理是编译过程的第一步,它处理源代码文件中的预处理指令(以#开头的指令)。预处理器的任务主要包括:

  • 宏定义(Macro Definition):处理#define指令,将宏名称替换为其定义的内容。
  • 条件编译(Conditional Compilation):通过#ifdef#ifndef#endif等指令,根据条件包含或排除代码段。
  • 文件包含(File Inclusion):通过#include指令将其他文件的内容插入到当前文件中。
  • 行控制和错误消息生成:使用#line指令控制编译器的错误和警告信息的行号,使用#error#warning生成错误和警告消息。

预处理后的结果是一个纯净的源代码文件,但其中已经包含了所有宏替换和文件包含的结果。

gcc –E code.c –o code.i
//选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
//选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

2、编译

编译是将预处理后的源代码文件转换成汇编代码的过程。编译器的主要任务包括:

  • 词法分析(Lexical Analysis):将源代码分解成一系列的标记(tokens)。
  • 语法分析(Syntax Analysis):根据语言的语法规则分析标记,构建语法树(Syntax Tree)。
  • 语义分析(Semantic Analysis):检查语法树中表达式的意义,进行类型检查等。
  • 中间代码生成(Intermediate Code Generation):将语法树转换成一种中间表示(Intermediate Representation, IR),便于后续处理。
  • 代码优化(Code Optimization):对中间代码进行优化,以提高代码执行效率。
  • 目标代码生成(Target Code Generation):将优化后的中间代码转换成目标机器的汇编代码。
gcc –S code.i –o code.s
//选项“-S”,该选项的作用是让 gcc 在编译结束后停止汇编过程。
//选项“-o”是指目标文件,“.s”文件为已经过预处理和编译的C程序

3、汇编

汇编是将汇编代码转换成机器代码的过程。汇编器(Assembler)读取汇编代码,并将其转换为特定机器的机器语言指令。机器代码是计算机可以直接执行的代码。

gcc –C code.s –o code.o
//选项“-C”,该选项的作用是让 gcc 在汇编结束后停止链接过程。
//选项“-o”是指目标文件,“.o”文件为已经过预处理、编译和汇编的C程序

4、链接

链接是将多个编译后的机器代码文件(以及库文件)合并成一个可执行文件或库文件的过程。链接器的任务主要包括:

  • 地址和空间分配 :为程序中的变量和函数分配内存地址。
  • 符号解析(Symbol Resolution):解析程序中的符号引用,即确定程序中调用的函数或引用的变量在内存中的位置。
  • 重定位(Relocation):修改代码和数据中的地址,以反映它们在内存中的最终位置。
  • 生成可执行文件或库文件 :将多个对象文件合并,并可能包括一些运行时库,最终生成可执行文件或库文件。

这四个阶段共同构成了从源代码到可执行程序的完整开发流程。在现代开发环境中,这些步骤通常由构建系统(如Make、CMake、Maven等)自动化完成。

gcc code.o –o code
//选项“-o”是指目标文件,code为最后的可执行程序

5、gcc选项

  • -E 激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w  不生成任何警告信息。
  • -Wall 生成所有警告信息。

6、函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了, 而这也就是链接的作用。

6.1 静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就 不再需要库文件了。

其后缀名一般为“.a”

 

 注意:

如果在编译过程中敲静态编译的指令报错后,检查是否是因为未安装静态库

静态库安装方法:

sudo yum -y install glibc-static
//静态库安装方法gcc -o code_static code.c -static
//静态库编译链接

6.2 动态库

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

动态库一般后缀名为“.so”。

gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。

gcc code.o –o code gcc

默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。


结语

这部分知识其实也并不多,了解.c文件变为可执行程序的过程即可,动态与静态库这里只作为提及,后续学习过程中我们会加深回他的理解,等今后的我们能力充足之后便可以熟知!

这篇关于Linux系统应用(5)——编译器gcc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145437

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听