gcc编译C语言

news2024/9/24 17:07:25

目录

文章目录

      • 一、gcc编译C语言过程
        • 1. 预处理阶段
        • 2. 编译阶段
        • 3. 汇编阶段
        • 4. 链接阶段
      • 二、示例
        • 1.预处理
        • 2.编译
        • 3.汇编
        • 4.链接
        • 5.执行命令

一、gcc编译C语言过程

gcc编译C语言程序的过程分成四个阶段:预处理、编译、汇编和链接。

在这里插入图片描述

编译流程命令作用解释
预处理阶段gcc -E hello.c -o hello.i该过程会对各种预处理指令(以#开头的代码行,如#include,#define,#ifdef等等)进行处理,删除注释和多余的空白字符。E是参数,是通知gcc对hello.c进行预编译; o是参数,是对命令输出结果进行导入操作,这里是将gcc -E hello.c操作结果输出到文件hello.i(这里文件名可以自定义)进行保存
编译阶段gcc -s hello.i -o hello.s该过程会对代码进行语法、语义分析和错误判断,生成汇编代码文件。S是参数,用于通知gcc对目标文件hello.i进行编译。
汇编阶段gcc -c hello.s -o hello.o该过程会将汇编代码转化为计算机可识别的二进制文件。对命令的解释:c是参数,用于通知gcc对文件hello.s进行指令转换操作。
链接阶段gcc hello.o -o hello该过程就是将多个.o文件合并成一个可执行文件(也就是二进制指令),类似windows下的.exe文件。对命令的解释:hello就是我们最后能够直接运行的可执行文件。
1. 预处理阶段

在这一阶段,gcc会对源代码进行预处理。预处理器会扫描源代码,并处理以’#'开头的预处理指令,如#include、#define等,将它们转换为实际的代码。预处理器还会将头文件中的内容复制到源文件中,形成一个完整的源代码文件。使用-E选项可以查看预处理后的代码。

2. 编译阶段

在这一阶段,gcc会将预处理后的源代码编译成汇编代码。gcc会对每个函数单独编译,并生成对应的汇编代码文件。使用-S选项可以查看生成的汇编代码。

3. 汇编阶段

在这一阶段,gcc会将汇编代码转换成机器码。汇编器会将汇编代码翻译成可执行的二进制指令,并生成目标文件。使用-c选项可以查看生成的目标文件。

4. 链接阶段

在这一阶段,gcc将目标文件与所依赖的库文件进行链接,生成可执行文件。链接器会将多个目标文件及其所依赖的库文件合并成一个可执行文件。使用-o选项可以指定生成的可执行文件名。

在编译过程中,可以使用各种编译选项来控制编译过程。例如,-I选项可以指定头文件的搜索路径,-L选项可以指定库文件的搜索路径,-l选项可以指定要链接的库文件,等等。

二、示例

接下来以一个简单的输出helloworld的程序演示一下这个过程。

hello.c

#include <stdio.h>
int main()
{       
        printf("HelloWorld!");
        return 0;
}     
1.预处理

预处理,生成预编译文件(.i文件)

gcc -E hello.c -o hello.i

在这里插入图片描述

将会产生 hello.i 文件,这就是 hello.c 经过预处理后的文件。

Vi 打开后进行查看。可以看到, hello.c 经过预处理后得到的 hello.i文件,除了原本的几行代码之外,还包含了很多额外的变量、函数等等,这些都是预处理器处理的结果。

2.编译

编译,生成汇编代码(.s文件)

gcc -S hello.i -o hello.s

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.汇编

得到了汇编文件后,通过 gcc 就可以得到机器码了。在终端输入下列命令,可以得到hello.o 目标文件。

gcc -c hello.s -o hello.o

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.链接

尽管已经得到了机器码,但这个文件却还是不可以运行的,必须要经过链接才能得到可执行文件。

在终端输入下列命令,将会得到可执行文件 a.out。

gcc hello.o

a.out 是 gcc 默认输出文件名称,可以通过-o 参数指定新的文件名。例如加上“-o hello”参数,将会生成 hello 文件,这个文件和 a.out 实际上是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.执行命令
./a.out

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

补充

上边内容也可以一步到位:

gcc hello.c

执行命令后直接生成a.out文件。

也可以编写Makefile文件,使用make 工具编译程序并执行。

详细请看:https://blog.csdn.net/m0_46202060/article/details/133934816?spm=1001.2014.3001.5501

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

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

相关文章

EasyRule源码:EasyRule框架源码分析

目录 1.简要介绍EasyRule 2.从实例入手看EasyRule使用方法 3.执行过程源码分析 3.1 Fact&Facts 3.2 规则定义和注册 3.2.1 Rule接口 3.2.2 规则注册管理 3.2.3 创建规则代理 3.3 规则引擎调度执行 1.简要介绍EasyRule 当下的规则引擎选择非常多&#xff0c;例如 …

PN8016 宽输出范围非隔离交直流转换芯片适用于非隔离的辅助电源

PN8016集成PFM控制器及800V高雪崩能力智能功率MOSFET&#xff0c;用于外围元器件极精简的小功率非隔离开关电源&#xff0c;输出电压可通过FB电阻调整。 PN8016内置800V高压启动与自供电模块&#xff0c;实现系统快速启动、超低待机、自供电功能。该芯片提供了完整的智能化保护…

Twitter正在测试年度订阅以进行推文和转推

导语&#xff1a;最近&#xff0c;Twitter&#xff08;现更名为X&#xff09;正在测试新的年度订阅服务&#xff0c;为未经验证的账户提供推文和转推等核心功能。这一举措是一个名为“Not A Bot”的测试计划的一部分&#xff0c;从本周二开始在新西兰和菲律宾用户中推出。通过设…

【MyBatis】mybatis工具类迭代

目录 MyBatis工具类的迭代 ThreadLocal使用 mybatis工具类终极版&#xff1a; MyBatis工具类的迭代 public class MyBatisUtil {//工具类构造方法私有化private void MyBatisUtil() {}//方法一public static SqlSession getSqlSession(){try {SqlSessionFactoryBuilder sql…

Xilinx DDR4 MIG 的调试

平台&#xff1a;Vivado2021.1 芯片&#xff1a;xcku115-flva1517-2-i (active) 语言&#xff1a;VerilogHDL 参考文件&#xff1a;pg150.下载地址 pg150-ultrascale-memory-ip.pdf • 查看器 • AMD 自适应计算文档门户 (xilinx.com) DDR4介绍 DDR4&#xff0c;即第四代…

隐藏Zotero批注图标(便利贴)

使用Zotero看文献做批注的时候&#xff0c;会出现图上类似于便利贴的图标&#xff0c;容易遮挡字体。 在"编辑"中选择"首选项"&#xff0c;"翻译"中去掉勾选"自动翻译批注"。 就好了

python二次开发Solidworks:扫描

在新零件文档中创建一个圆形草图和两条线段草图&#xff0c;并将它们插入到模型中。接着&#xff0c;选中圆形草图作为扫描轮廓&#xff0c;并选中两条线段草图并将它们分组为一个对象。最后&#xff0c;使用特征管理器的InsertProtrusionSwept4方法创建扫描特征。 import win…

gson如何序列化子类

需求 目前有一个需求&#xff0c;不同对象有一些公共属性&#xff0c;分别也有一些不同的属性。对方传过来的json字符串中&#xff0c;把这些对象组成了一个数组返回过来的。这样该如何反序列化呢&#xff1f; 举例 定义Person类、Student类、Worker类&#xff1b; Data To…

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型 SKRR这是Gustau Camps-Valls等人在“用深度结构核回归检索物理参数”中提出的结构核岭回归&#xff08;SKRR&#xff09;方法。 参考文献&#xff1a; Camps-Valls,Retrieval of Physical Pa…

期中考核复现(web)

1z_upload 进到这个页面里面还是挺懵的&#xff0c;什么也不知道 点添加书籍之后发现变成了sql 师兄给了源码&#xff0c;看了之后找到了他的限制函数 但是肯定要先登录才可以 登录还是用bp爆破 最后得到账号密码是admin/admin12345 进来之后就可以看到那个文件上传的地方 上…

RabbitMQ入门到实战教程,MQ消息中间件,消息队列实战

消息队列是目前最常见的微服务中间件之一&#xff0c;而RabbitMq在全球范围内的使用率也是名列前茅。它以稳定性强、并发高、低时延的特点深受广大企业开发者的喜爱。然而市面上一致缺乏一个专门的RabbitMQ课程&#xff0c;所以这套课程应运而生。 微服务一旦拆分&#xff0c;必…

【Bug】【内存相关】偶然发现一个内存溢出Bug复盘

一、问题 跑自动化用例的时候&#xff0c;uat-sg环境&#xff0c;发现SGW经常会返回 502 Bad Gateway响应 二、原因 经过SRE和BE Dev共同排查&#xff0c;502 是从ALB-- > 后端服务 后端服务无法响应导致&#xff0c;ALB会直接给客户端返回502。 服务端&#xff1a;由于c…

C# Winform编程(6)高级控件

C# Winform编程&#xff08;6&#xff09;高级控件 RadioButton&#xff08;单选框&#xff09;PictureBox&#xff08;图像框&#xff09;TabControl&#xff08;选项卡&#xff09;ProgressBar(进度条)TrackBar(滑动条)ImageList&#xff08;图像列表控件&#xff09;ToolBar…

29栈与队列——优先队列

目录 LeetCode之路——347. 前 K 个高频元素 分析 优先队列 简单示例 运行结果 源码简析 LeetCode之路——347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: num…

一剑破万法:noexcept与C++异常导致的coredump

作为C/C程序员&#xff0c;最不想见到的就是coredump。导致coredump的原因有很多&#xff0c;今天我来谈一下其中一种十分常见的原因&#xff0c;那就是由于C异常没有被catch导致的coredump。 从一篇知乎文章讲起 先看一位知友的文章&#xff1a; C11 std::thread异常coredu…

[ROS2系列] ORBBEC(奥比中光)AstraPro相机在ROS2进行rtabmap 3D建图

目录 背景&#xff1a; 一、驱动AstraPro摄像头 二、安装rtabmap error1&#xff1a;缺包 三、尝试 四、参数讲解 五、运行 error2: Did not receive data since 5 seconds! 六、效果​编辑 error4: 背景&#xff1a; 1、设备&#xff1a;pc&#xff1b;jeston agx …

使用kyuubi查询出现集群单节点cpu飙升问题

问题现象&#xff1a; 单节点cpu飙升 初步定位原因是: 业务人在查询操作时&#xff0c;表被锁表&#xff0c;查询不出结果&#xff0c;就反复执行&#xff0c;导致堆积&#xff0c;并kyuubi又是高并发操作。 &#xff08;当一些操作在共享锁阻塞期间积压时&#xff0c;这些操…

Leetcode 349 两个数组的交集 (*哈希数组,*HashSet,*HashMap)

Leetcode 349 两个数组的交集 &#xff08;*哈希数组&#xff0c;*HashSet&#xff0c;*HashMap&#xff09; 解法1 [用数组构建hashmap] &#x1f60b;HashSet and .HashMap1.HashSet2.HashMap 解法2 [使用HashSet]⭐️ 解法1 [用数组构建hashmap] &#x1f60b; 自己的笨比方…

【ES实战】ES主副分片数据不一致分析

ES主副分片数据不一致分析 文章目录 ES主副分片数据不一致分析问题描述问题重现问题分析修复方案 问题描述 在请求索引中的某一条数据时&#xff0c;时而查询有结果&#xff0c;时而无结果。两种情况交替出现。 问题重现 通过对问题数据的点查&#xff0c;确实重现了该现象 …

CSDN 操作

CSDN的目录界面&#xff0c;会随着浏览器界面的大小而变化&#xff0c;分布在左边位置或者右边位置。 目录界面在右&#xff1a; 目录界面在左&#xff1a; 按键Ctrl&#xff0c; 滑动鼠标滚轮&#xff0c;就可以放大或者缩小界面。