gcc的编译C语言的过程

news2024/11/28 6:43:39

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.coloradmin.cn/o/1903051.html

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

相关文章

【Unity数据交互】如何Unity中读取Ecxel中的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

picgo+gitee图床配置

node.js安装 刚开始顺着picgo操作,直接跳转到了node.js官网 下载的时候直接 Next,然后可以自定义安装路径,我的安装路径是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js 然后再在安装路径的根目录下新建两个文件夹,nodecache 和 nodeglobal, 如图所示:…

ida动态调试-cnblog

ida动态调试 传递启动ida服务 android_server在ida\dbgsrv目录中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida报错:大多是手机端口被占用 报错提示&#xff1a; …

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率&#xff0c;这个问题非常关键&#xff01; 以下为GD32F303系列MCU中有关ADC的参数&#xff0c;其中ADC时钟最大值为40MHz&#xff0c;12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话&#xff0c;可能会造成ADC采样异常&…

ARTS Week 36

unsetunsetAlgorithmunsetunset 本周的算法题为 1528. 重新排列字符串 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 img 示例 1&#xff1a;输入&…

Google RichHF-18K 文本到图像生成中的丰富人类反馈

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

使用python编程的视频文件列表应用程序

简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍一个基于 wxPython 的视频文件列表应用程序。该应用程序允许用户选择一个文件夹&#xff0c;并显示该文件夹中的视频文件列表。用户可以选择文件并查看其详细信息&#xff0c;导出文件列表为文本文件&#xff0c;以及播放…

Python酷库之旅-第三方库Pandas(008)

目录 一、用法精讲 16、pandas.DataFrame.to_json函数 16-1、语法 16-2、参数 16-3、功能 16-4、返回值 16-5、说明 16-6、用法 16-6-1、数据准备 16-6-2、代码示例 16-6-3、结果输出 17、pandas.read_html函数 17-1、语法 17-2、参数 17-3、功能 17-4、返回值…

68.WEB渗透测试-信息收集- WAF、框架组件识别(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;67.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;7&#xff09; 右边这些是waf的…

C++ | Leetcode C++题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {if (s.find(x) ! s.end()) {return true;}s.insert(x);}return false;} };

R语言fastshap包进行支持向量机shap可视化分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

揭秘Conda:Python开发者必备的包管理神器

conda 简介 Conda 是一个开源的包管理系统和环境管理系统&#xff0c;用于安装和管理软件包以及创建和维护不同的软件环境。 它最初是为 Python 语言设计的&#xff0c;但现在已经支持多种编程语言&#xff0c;包括 R、Ruby、Lua、Scala 等。 1、Anaconda&#xff1a;是一个…

041基于SSM+Jsp的高校校园点餐系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…

整洁架构SOLID-单一职责原则(SRP)

文章目录 定义案例分析重复的假象代码合并解决方案 小结 定义 SRP是SOLID五大设计原则中最容易被误解的一个。也许是名字的原因&#xff0c;很多程序员根据SRP这个名字想当然地认为这个原则就是指&#xff1a;每个模块都应该只做一件事。 在历史上&#xff0c;我们曾经这样描…

全网最适合入门的面向对象编程教程:10 类和对象的Python实现-类的继承和里氏替换原则,Python模拟主机和传感器自定义类

全网最适合入门的面向对象编程教程&#xff1a;10 类和对象的 Python 实现-类的继承和里氏替换原则&#xff0c;Python 模拟主机和传感器自定义类 摘要&#xff1a; 本文主要介绍了类的继承的基本概念和里氏替换原则&#xff0c;以模拟传感器数据串口输出-上位机串口接收为例…

Python结合MobileNetV2:图像识别分类系统实战

一、目录 算法模型介绍模型使用训练模型评估项目扩展 二、算法模型介绍 图像识别是计算机视觉领域的重要研究方向&#xff0c;它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制&#xff0c;设计高效的图像识别算法变得尤为重要。…

【反悔贪心 反悔堆】1642. 可以到达的最远建筑

本文涉及知识点 反悔贪心 反悔堆 LeetCode1642. 可以到达的最远建筑 给你一个整数数组 heights &#xff0c;表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程&#xff0c;不断向后面的建筑物移动&#xff0c;期间可能会用到砖块或梯子。 当…

AJAX-个人版-思路步骤整理版

前置知识&#xff1a;老式的web创建工程方法就是创建项目然后添加web工件&#xff0c;然后添加lib依赖如&#xff1a;tomcat,servlet&#xff0c;等。 传统请求 对于传统请求操作&#xff1a;整体流程也就是创建静态页面&#xff0c; <!DOCTYPE html> <html lang&q…

秋招突击——7/6——复习{前K个高频元素}——新作{数据流的中位数、有效括号、最小栈、字符串解码}

文章目录 引言复习前K个高频元素——使用堆去做个人实现参考官方——使用堆实现定义优先队列的基本方式 新作数据流的中位数个人实现参考做法 有效括号个人实现参考实现 最小栈个人实现参考实现 字符串解码个人实现参考实现 总结 引言 差不多摆烂了一上午&#xff0c;本来今天…