gcc编译的过程

news2024/11/20 7:24:58

文章目录

  • 前言
  • 一、gcc 编译四步骤
  • 二、gcc编译常用参数
  • 三、文件后缀名对应表
  • 四、预处理
  • 五、编译
  • 六、汇编
  • 七、链接
    • 1、静态链接
    • 2、动态链接


前言

  • GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过 gcc 命令就可以将源文件编译成可执行文件。

  • 一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等4步才能变成可执行文件,通常使用“编译”统称这4个步骤。


一、gcc 编译四步骤

在这里插入图片描述

二、gcc编译常用参数

-I 指定头文件所在目录位置
-c 只做预处理,编译,汇编。得到二进制文件
-g 编译时添加调试文件,用于 gdb 调试
-Wall 显示所有警告信息
-D 向程序中“动态”注册宏定义
-l 指定动态库库名
-L 指定动态库路径

三、文件后缀名对应表

后缀名类型
.cc源程序
.h预处理器文件
.cppc++源程序
.i预处理后的c文件
.ii预处理后的c++文件
.s汇编语言源程序
.o目标文件(Object file)
.a静态链接库文件(linux)
.so动态链接库文件(linux)
.lib静态链接库文件(windows)
.dll动态链接库文件(windows)

四、预处理

预处理是读取 c 源程序,对其中的伪指令(以 # 开头的指令,也就是宏)和特殊符号进行“替代”处理;经过此处理,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,仍然是 C 文件,但内容有所不同。

预处理主要包括以下过程:

  • 将所有的 #define 删除,并且展开所有的宏定义
  • 处理所有的条件预编译指令,比如 #if #ifdef #elif #else #endif 等
  • 处理 #include 预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 删除所有注释 “//”和”/* */”.
  • 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  • 保留所有的 #pragma 编译器指令,因为编译器需要使用它们

下面我们将一端简单的C代码做示例。

/* --------普通的c代码----------*/
#include <stdio.h>
#define COUNTE 5

int main(int argc,char ** argv)
{
    for(int i=0; i <= COUNTE; i++) {
        printf("hello world!\n");
    }   

    return 0;
}

然后经过预处理:

gcc -E hello.c -o hello.i

其注释被删除,且宏也被替代之后删除,如下图所示。
在这里插入图片描述

五、编译

编译程序所要作的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码

 gcc -S hello.i -o hello.s

在这里插入图片描述
不同的编译器交叉编译同一个 hello.i 文件生成的汇编文件也不相同,这也是 C 语言可移植性的一种体现。

六、汇编

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个 C 语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。 目标文件由段组成。通常一个目标文件中至少有两个段:

  • 代码段(文本段):该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般不可写;
  • 数据段:主要存放程序中要用到的各种常量、全局变量、静态的数据。一般数据段都是可读,可写,可执行的;
gcc -c hello.s -o hello.o  

在这里插入图片描述
因为翻译成了计算机可以识别的二进制文件,因此乱码。

七、链接

汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。 链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体,也就是可执行程序。 根据开发人员指定的库函数的链接方式的不同,链接处理可分为两种:

  • 静态链接
  • 动态链接

1、静态链接

静态链接的优点:
(1)装载速度很快,运行速度比动态链接快;
(2)只需要开发人员在开发机上有完整的.lib文件,不需要在用户机器上有完整的.lib文件,自完备

静态链接的缺点:
(1)可执行文件很大,并且相同代码很多,资源浪费

动态链接编译:

gcc hello.o -o hello -static

在这里插入图片描述

2、动态链接

动态链接的优点:
(1)可执行文件很小;
(2)适合大规模软件开发,开发过程耦合度小、独立,便于不同开发人员和开发组织开发;
(3)不同编程语言按照约定可以使用同一套.dll库;

动态链接的缺点:
(1)速度没有静态链接快;
(2)不具有自完备,如果用户机器中没有.dll文件,程序将无法运行并且报错

动态链接编译:

 gcc hello.o -o hello

在这里插入图片描述


我的qq:2442391036,欢迎交流!

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

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

相关文章

人机识别技术再升级,AIGC为验证码带来万亿种新变化

网上输入关键词“破解验证码”&#xff0c;会出现1740万个搜索结果。“验证码识别、轻松破解、暴力破解、逻辑漏洞破解、简单破解”等等各类关键词的内容&#xff0c;不一而足&#xff0c;关于“如何用破解某某验证码”的帖子更是多如牛毛。 搜索引擎的相关结果 2017年&#xf…

线程池的构造方式

线程池的构造方式 两类构造方式7种实现方法7种线程池的具体使用FixedThreadPoolCachedThreadPoolSingleThreadExecutorScheduledThreadPoolSingleThreadScheduledExecutornewWorkStealingPoolThreadPoolExecutor 说明总结 两类构造方式 在Java语言中&#xff0c;并发编程都是通…

【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)

&#x1f517; 运行环境&#xff1a;matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

异常详解

一、初识异常 异常概念&#xff1a; 所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制。 而运行时指的是程序已经编译通过得到 class 文件了, 再由 JVM 执行过程中出现的错误。 1.除以 0 System.out.println(10 / 0); // 执行结果 Exception in thread "…

02 - 学会提问

学会提问 一、引言 1.1 GPT简介 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力&#xff0c;GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…

python+vue 高校资助系统

其中各子模块的主要功能如下&#xff1a; 1、用户登录&#xff1a;用户进入系统先输入用户名与密码&#xff0c;选择权限登录&#xff0c;用户登录成功&#xff0c;要记录登录的用户名和登录类型。 2、学生注册&#xff1a;学生注册填写学号、密码、确认密码、学生姓名、邮箱、…

Python小姿势 - Python操作MongoDB数据库

Python操作MongoDB数据库 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 现在&a…

Leetcode力扣秋招刷题路-0295

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 …

springboot,Flowable 流程实例的激活与挂起(二)

一.简介 接上一篇 springboot&#xff0c;Flowable 流程实例的激活与挂起&#xff08;一&#xff09; 二.流程实例的挂起与激活 1.流程实例的挂起 挂起一个流程实例的代码如下&#xff1a; Test void test08() {List<ProcessDefinition> list repositoryService.cr…

Cycling 74 Max for Mac:音乐可视化编程软件

Cycling 74 Max是一款音乐、视觉、互动艺术等领域中广泛使用的编程语言和应用软件&#xff0c;它允许用户创作和控制实时音频和视频效果、交互式应用程序和媒体艺术品等。 Max将程序设计和可视化编程相结合&#xff0c;通过简单的拖拽和连接方式&#xff0c;用户可以将各种功能…

cuda编码例程(转载借鉴)

内容出处&#xff1a;https://mp.csdn.net/mp_blog/creation/editor 1. 前言 这是一份简单的CUDA编程入门&#xff0c;主要参考英伟达的官方文档进行学习&#xff0c;本人也是刚开始学习&#xff0c;如有表述错误&#xff0c;还请指出。官方文档链接如下&#xff1a; An Eve…

第2章-类加载子系统

1、本系列博客&#xff0c;主要是面向Java8的虚拟机。如有特殊说明&#xff0c;会进行标注。 2、本系列博客主要参考尚硅谷的JVM视频教程&#xff0c;整理不易&#xff0c;所以图片打上了一些水印&#xff0c;还请读者见谅。后续可能会加上一些补充的东西。 3、尚硅谷的有些视频…

vue 实现el-select组件 配合 el-tabs 完成动态tabs然后有勾选 全选,还有模拟提交,回显数据

cv即可使用 <!DOCTYPE html> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" conten…

Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index)&#xff1a;对应最左边那一竖列 列索引(columns)&#xff1a;对应最…

使用手机在网状态查询 API 有效防止虚假注册的设计思路

引言 随着移动互联网的普及&#xff0c;手机在网状态成为重要的数据指标。在网状态反映了手机用户的实际使用情况&#xff0c;对于各类企业和机构具有重要意义。 本文将为大家介绍手机在网状态 API 的主要特点和优势&#xff0c;并且探讨手机在网状态 API 的应用场景和效果展…

【小DS】ABC250 E - Prefix Equality

一开始看题解把我CPU干烧了 后来豁然开朗 E - Prefix Equality (atcoder.jp) 题意&#xff1a; 给定两个数组a,b&#xff0c;每次询问两个位置x和y&#xff0c;问a数组前x个构成的集合和b数组前y个构成的集合是不是一样 思路&#xff1a; 一开始纯暴力RE了 #include <…

IDEA 重磅插件 - Bito – GPT-4

笔者会陆续在个人主页 “AI” 专栏推荐优质 AI 软件、插件、网站… 而不是一股脑地抛给你一堆自行筛选&#xff0c;每一款都是笔者亲自体验感觉还不错的。 如果对你有帮助记得一键三连获取最新优质文章&#xff01; 1.介绍 Bito – GPT-4 Bito – GPT-4 & ChatGPT to writ…

WiFi 时钟

WiFi 时钟有很多开源项目的。但是&#xff0c;成品往往代码一大篇&#xff0c;看起来有些上头。加上有些库和环境的版本变迁&#xff0c;编译报错排查起来很是费劲。于是从头捋一遍&#xff0c;一步一步的过程&#xff0c;容易上手&#xff1a; 准备工作&#xff1a; a 零件&…

Netty源码解读

Netty源码解读 Netty线程模型 1、定义了两组线程池BossGroup和WorkerGroup&#xff0c;BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写 2、BossGroup和WorkerGroup类型都是NioEventLoopGroup&#xff0c;Group中维护了多个事件循环线程NioEventLoop&#…

AI新产品层出不穷,学不过来怎么办。

最近各个互联网巨头和创业新贵发布的AI工具&#xff0c;AI模型层出不穷&#xff0c;相关自媒体的热度也都很高&#xff0c;当然&#xff0c;各种大佬的隔空喊话也是非常吸引眼球&#xff0c;那么很多人就会觉得&#xff0c;要看的东西太多了&#xff0c;要学的东西太多了&#…