gcc的编译C语言的过程

gcc的简介

        GCC(GNU Compiler Collection)是由GNU项目开发和维护的一套开源编程语言编译器集合。它支持多种编程语言,包括但不限于C、C++、Objective-C、Fortran、Ada等。GCC被广泛应用于编译和优化各种程序,是许多开发者和组织的首选工具之一。gcc默认编译C语言。  

gcc编译C语言过程

过程简介:预处理、编译、汇编、链接四个过程,由.c文件形成中间文件:.i、.s、.o文件,最终形成可执行文件。

预处理:将.c中的头文件展开、宏展开、条件编译、注释删除,生成的文件是.i文件,注意预处理过程不会对文件代码做任何语法检查。

gcc -E hello.c -o hello.i \\-E选项指定gcc只做预处理过程

编译:将预处理后的.i文件生成.s汇编文件,注意编译过程会对代码进行语法检查。

gcc -S hello.i -o hello.s    //-S选项指定gcc只做编译过程

汇编:将编译产生的汇编文件处理生成.o目标文件,也就是汇编语言转换为二进制语言

gcc -c hello.s -o hello.o    //-c选项指定gcc将汇编文件转换为目标文件

链接:将.o文件链接成目标文件,多个.c源文件经过四个步骤最终形成了我们想要的目标文件,也就是最终的可执行文件。

gcc hello.o -o hello    \\通过gcc将多个*.o链接成一个可执行文件

案例

代码目录结构:

.
├── hello.i        //cat main.i myfunc.i > hello.i,是gcc生成的.i文件
├── hello.s        //cat main.s myfunc.s > hello.s,是gcc生成的.s文件
├── main.c         //源文件
├── main.i        //gcc -E main.c -o main.i
├── main.o        //gcc -c main.s -o main.o
├── main.s        //gcc -S main.i -o main.s
├── my_execfile        //gcc main.o myfunc.o -o my_execfile 最终的目标文件
├── myfunc.c         //源文件
├── myfunc.h         //头文件
├── myfunc.i        //gcc -E myfunc.c -o myfunc.i
├── myfunc.o        //gcc -c myfunc.s -o myfunc.o
└── myfunc.s        //gcc -S myfunc.i -o myfunc.s

0 directories, 12 files

maic.c

#include <stdio.h>
#include "myfunc.h"  // 包含自定义头文件

// 宏定义
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#define A 10
int main() {
    int b = 20;
    int maxValue;

    // 基于宏的条件编译
    #ifdef DEBUG
        printf("调试模式已启用。\n");
    #else
        printf("调试模式已禁用。\n");
    #endif

    // 使用MAX宏
    maxValue = MAX(A, b);
    printf("%d和%d之间的最大值是:%d\n", A, b, maxValue);

    // 调用在myfunc.h中定义的函数
    int factorialResult = factorial(5);
    printf("5的阶乘是:%d\n", factorialResult);

    return 0;
}

myfunc.h

#ifndef MYFUNC_H  // 头文件包含保护,以防止多重包含
#define MYFUNC_H

// 阶乘函数的函数原型
int factorial(int n);

#endif  // 头文件包含保护结束

myfunc.c

#include "myfunc.h"

// 阶乘函数的定义
int factorial(int n) {
    if (n <= 1)
        return 1;
    else
        return n * factorial(n - 1);
}

1、预处理:通过gcc工具链指定-E选项对maic.c、myfunc.c文件处理,即只进行预处理过程,形成hello.i文件,该过程会对宏展开,宏条件编译选择,头文件展开,注释全部删除。可通过操作验证。

hello.i部分内容

2、编译:通过gcc工具链指定-S选项对maic.i、myfunc.i文件处理,即只进行编译过程,形成main.s、myfunc.s文件,该过程会对*.i文件进行语法检查,确保语法正确并生成*.s汇编文件。可通过操作验证。补充:汇编语言是最接近二进制语言的低级编程语言,所有的高级编程语言要中转汇编语言。

hello.s部分内容

 3、汇编:通过gcc工具链指定-c选项对maic.s、myfunc.s文件处理,即只进行汇编过程,形成main.o、myfunc.o文件。可通过操作验证。补充:*.o是目标文件,也就是可执行文件,该文件一般不可读(乱码),是机器设备能识别的二进制语言文件。

4、链接:通过gcc工具链对maic.o、myfunc.o文件进行链接,形成my_execfile文件,即最终的可执行文件。可通过操作验证。

执行:./my_execfile

预处理过程案例补充

 预处理过程会对宏条件编译根据条件进行一次选择处理

上面的预处理步骤变化:加宏-DDEBUG,条件发生变化

gcc -E main.c -o main.i -DDEBUG    //加宏参数对宏条件选择预处理

main.i 部分内容 (上面的预处理过程输出结果由禁用条件被替换成启用条件)

 

小结

以上的步骤其实都可以被优化,我们编译文件只需要执行gcc -o my_execfile hello.c即可生成最终的可执行文件my_execfile

然而,这条语句依然可以进一步的优化,通过makefile文件处理,执行make,也可以形成我们最终想要的可执行文件,不管是哪种优化,都离不开千锤百炼的基础和经验,以上内容对于了解c语言希望有所帮助。前人栽树,后人乘凉~ 

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

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

相关文章

防火墙基础及登录(华为)

目录 防火墙概述防火墙发展进程包过滤防火墙代理防火墙状态检测防火墙UTM下一代防火墙&#xff08;NGFW&#xff09; 防火墙分类按物理特性划分软件防火墙硬件防火墙 按性能划分百兆级别和千兆级别 按防火墙结构划分单一主机防火墙路由集成式防火墙分布式防火墙 华为防火墙利用…

ubuntu22.04+pytorch2.3安装PyG图神经网络库

ubuntu下安装torch-geometric库&#xff0c;图神经网络 开发环境 ubuntu22.04 conda 24.5.0 python 3.9 pytorch 2.0.1 cuda 11.8 pyg的安装网上教程流传着许多安装方式&#xff0c;这些安装方式主要是&#xff1a;预先安装好pyg的依赖库&#xff0c;这些依赖库需要对应上pyth…

C++11|包装器

目录 引入 一、function包装器 1.1包装器使用 1.2包装器解决类型复杂 二、bind包装器 引入 在我们学过的回调中&#xff0c;函数指针&#xff0c;仿函数&#xff0c;lambda都可以完成&#xff0c;但他们都有一个缺点&#xff0c;就是类型的推导复杂性&#xff0c;从而会…

详解Amivest 流动性比率

详解Amivest 流动性比率 Claude-3.5-Sonnet Poe Amivest流动性比率是一个衡量证券市场流动性的重要指标。这个比率主要用于评估在不对价格造成重大影响的情况下,市场能够吸收多少交易量。以下是对Amivest流动性比率的详细解释: 定义: Amivest流动性比率是交易额与绝对收益率的…

一.2.(1)双极型晶体三极管的结构、工作原理、特性曲线及主要参数

1.双极型晶体三极管的结构 学会区分P管和N管&#xff0c;会绘制符号 2.工作原理 无论是PNP 还是NPN&#xff0c;本质上放大时&#xff0c;都是发射结正偏&#xff0c;集电极反偏。&#xff08;可以简单理解为pn为二极管&#xff0c;每个三极管都有两个二极管&#xff09; 其中电…

行内元素、块级元素居中

行内元素居中 水平居中 {text-align&#xff1a;center;}垂直居中 单行——行高等于盒子高度 <head><style>.father {width: 400px;height: 200px;/* 行高等于盒子高度&#xff1a;line-height: 200px; */line-height: 200px;background-color: pink;}.son {}&…

深入刨析Redis存储技术设计艺术(二)

三、Redis主存储 3.1、存储相关结构体 redisServer:服务器 server.h struct redisServer { /* General */ pid_t pid; /* Main process pid. */ pthread_t main_thread_id; /* Main thread id */ char *configfile; /* Absolut…

js获取当前浏览器地址,ip,端口号等等

前言&#xff1a; js获取当前浏览器地址&#xff0c;ip&#xff0c;端口号等等 window.location属性查询 具体属性&#xff1a; 1、获取他的ip地址 window.location.hostname 2、获取他的端口号 window.location.port 3、获取他的全路径 window.location.origin 4、获取…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关&#xff0c;使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 本网关通过上位机来进行配置。 首先安装上位机软件 一…

【日志信息管理】管理日志信息的类

日志用于记录程序的执行记录包括程序的出错记录&#xff0c;程序致命退出原因&#xff0c;程序的正常执行记录。这样我们就可以很快的察觉程序的错误原因、执行状况等等&#xff0c;因此管理日志信息是非常重要的。 日志一般由以下部分组合&#xff1a; 日志时间、日志等级、…

数据库可视化管理工具dbeaver试用及问题处理。

本文记录了在内网离线安装数据库可视化管理工具dbeaver的过程和相关问题处理方法。 一、下载dbeaver https://dbeaver.io/download/ 笔者测试时Windows平台最新版本为&#xff1a;dbeaver-ce-24.1.1-x86_64-setup.exe 二、安装方法 一路“下一步”即可 三、问题处理 1、问…

06浅谈大语言模型可调节参数TopP和TopK

浅谈大模型参数TopP和TopK 大语言模型中的temperature、top_p和top_k参数是用来控制模型生成文本时的随机性和创造性的。下面分享一下topP和topK两个参数的意义及逻辑&#xff1b; top K&#xff08;Top-K Sampling&#xff09; 作用&#xff1a;只从模型认为最可能的k个词中选…

排序-java(插入排序和选择排序)

一&#xff0c;分类 主要的排序大致分为以下几类&#xff1a; 1&#xff0c;插入排序&#xff0c;又分为直接插入排序和希尔排序 2&#xff0c;选择排序&#xff0c;又分为选择排序和堆排序 3&#xff0c;交换排序&#xff0c;又分为冒泡排序和快速排序 4&#xff0c;归并…

Python中异步事件触发

1、问题背景 在Python中&#xff0c;我想创建一个由事件生成控制流程的类结构。为此&#xff0c;我做了以下工作&#xff1a; class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…

如何借助AI在20分钟内写一个springboot单表的增删改查

目录 1. AI工具介绍2. 写代码的正确顺序2.1 编写 Entity 类&#xff1a;2.2 编写 Mapper 接口&#xff1a;2.3 编写 Mapper XML 文件&#xff08;如果使用 MyBatis&#xff09;&#xff1a;2.4 编写 Service 接口&#xff1a;2.5 编写 Service 实现类&#xff08;ServiceImpl&a…

【全面讲解如何安装Jupyter Notebook!】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

智慧校园综合解决方案PPT(41页)

1. 方案背景 智慧校园综合解决方案响应《教育信息化2.0行动计划》等政策&#xff0c;旨在加快智慧校园建设&#xff0c;推动信息化与学习生活的深度融合。目前教育信息化配套设施建设存在“孤岛架构”&#xff0c;学生安全问题频发&#xff0c;技术发展迅速&#xff0c;家长对…

IT高手修炼手册(3)程序员命令

一、前言 程序员在日常工作中&#xff0c;掌握一些高效的快捷键可以大大提高编码和开发效率。 二、通用快捷键 文本操作Ctrl A&#xff1a;全选当前页面内容 Ctrl C&#xff1a;复制当前选中内容 Ctrl V&#xff1a;粘贴当前剪贴板内的内容 Ctrl X&#xff1a;剪切当前选中…

[图解]SysML和EA建模住宅安全系统-11-接口块

1 00:00:00,660 --> 00:00:04,480 接下来的步骤是定义系统上下文 2 00:00:04,960 --> 00:00:07,750 首先是图17.17 3 00:00:09,000 --> 00:00:10,510 系统上下文展示了 4 00:00:10,520 --> 00:00:12,510 ESS和外部系统、用户 5 00:00:12,520 --> 00:00:14,1…

C++初学者指南-4.诊断---地址检测器

C初学者指南-4.诊断—地址检测器 幻灯片 地址检测器&#xff08;ASan&#xff09; 适用编译器g,clang检测内存错误 内存泄露访问已经释放的内存访问不正确的堆栈区域 用额外的指令检测代码 运行时间增加约70%内存使用量大约增加了3倍 示例&#xff1a;检测空指针 使用地址…