使用gcc编译代码时的具体过程


前言

gcc 是我们在进行Linux编程时常用的编译工具,可支持多种编程语言,本文将讨论gcc编译代码的具体步骤

一、以一个熟悉的代码为例子

我们以最熟悉的“hello world”代码为例
代码如下
在这里插入图片描述

1、一步到位的编译

代码如下

gcc text.c -0 text
在这里插入图片描述

2.代码的编译过程

2.1 预处理

预处理的过程包括:

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

代码如下

gcc -E text.c 或gcc -E text.c -o text,i

若选择输出后者,可以发现打开的 text.i 文件存放的是text.c预处理后的代码
``在这里插入图片描述
gcc -E 表示编译过程在预处理后停止

2.2 编译为汇编代码

代码如下

gcc -s text.i -o text.s

在这里插入图片描述

2.3汇编

代码如下:

gcc -c text.s -o text.o

在这里插入图片描述

2.4 链接(连接)

链接分为静态链接和动态链接。
(1)静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。

(2)动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
代码如下
在这里插入图片描述

(静态链接)
在这里插入图片描述
(动态链接)

2.5 多个代码的编译过程

若存在 text1.c text2.c 等多个源文件 gcc也是可以十分有效的完成编译的
代码如下

gcc text1.c text2.c -c text

或者

gcc -c text1.c -o text1.o
gcc -c text2.c -o text2.o
gcc text1.o text2.o text

2.6 检错

-pedantic编译选项并不能保证被编译程序与ANSISOC标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSISO C标准的代码,但不是全部,事实上只有ANSIISo C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。
具体代码如下

gcc -pedantic illcode,c -oi llcode

还有一些- W开头的检错命令

gcc -wall illcode.c -o illcode
gcc -werror test.c -o test

这些命令可以让gcc产生更多的警告信息

2.7库文件连接

开发软件时,我们通常需要许多的库函数,而在Linux下,这些库函数的目录通常不统一。我们需要自己想办法查找这些库函数。具体步骤如下
1.编译成可执行文件
代码如图
在这里插入图片描述
2.链接
代码如图
在这里插入图片描述

总结

以上内容就是有关gcc编译过程的完整环节,从中我们不难看到代码的工作时一个严谨而又层次分明的过程。这次学习遇到的问题很多,当大多属于小而杂的类型,所以还是比较顺利的。

Bopie
关注 关注
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCC编译器的使用
qq_42848805的博客
02-10 902
gcc编译器的使用和命令详解。
【002 指令】常用的GCC命令和GDB调试指令
kashine的博客
02-01 1100
GDB 全称“GNU symbolic debugger”,是 Linux 下常用的程序调试器。一般来说,GDB主要帮助我们完成以下四个方面的功能:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。在某个指定的地方或条件下暂停程序。当程序被停住,可以检查此你的程序中所发生的事。在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。非常类似与Visual Studio的调试功能!
Linuxgcclinux下的编译器)程序的编译和链接详解
最新发布
m0_71503225的博客
03-28 1530
gcclinux下的一款编译器,可以在指令级别将代码编译形成可执行程序格式gcc [选项要编译的文件选项] [目标文件】我们手动编写一个简单的程序使用指令gcc 文件名进行编译也可以在底行模式中直接编译生成一个a.out的可执行程序./a.out运行这个程序这是gcc的一个快速认识关于gcc其他的指令-E只激活预处理这个不生成文件你需要把它重定向到一个输出文件里面-S编译到汇编语言不进行汇编和链接-c编译到目标代码-o文件输出到 文件。
GCC编译C/C++/汇编代码
LightBoat09的专栏
04-05 2096
ubuntu GCC 编译C/C++/汇编
代码编译
紅桃10
08-07 998
确认源代码编译环境,需要支持C/C++程序语言的编译器,如: gcc-4.4.7-4.el6 gcc-c+±4.4.7-4.el6 make-3.8.1-20.el6 一、在服务器ftp://172.16.0.1中下载源代码 二、在Xhell中点,将httpd-2.2.17.tar移到Xshell中/root ,/, /usr/src 三、tar解包 [root@localho...
linux使用gcc编译c语言共享库步骤
09-04
Linux系统中,使用GCC(GNU Compiler Collection)编译C语言共享库是...总之,理解如何在Linux使用GCC编译C语言共享库是每个系统级开发者的基础技能,这不仅有助于提高代码复用性,还能提升程序的效率和可维护性。
gcc 12.0使用手册
12-31
用户可以通过GDB来调试由GCC编译的程序,设置断点、查看内存状态、单步执行代码等。虽然手册未深入讲解GDB的使用,但通常GDB的使用技巧和命令会在GCC文档的调试部分进行说明。 在二进制兼容性方面,88910页的内容...
GCC编译动态和静态链接库.pdf
07-10
静态库是指在程序编译被连接到目标代码中的库文件。静态库的优点是程序运行不再需要该库文件,但是缺点是程序的体积较大。静态库的创建过程包括以下步骤: 1. 编辑源程序,并将其编译成 .o 文件。 2. 使用 ar ...
代码编译安装nginx,编译安装nginx的好处
01-03
以下将详细阐述源代码编译安装Nginx的过程及其优缺点。 **源代码编译安装的好处:** 1. **定制化安装**:源代码编译允许你选择开启或关闭特定模块,如HTTP Stub Status Module、Real IP Module、SSL Module、GZIP ...
GCC的开发编译配置
09-02
5. `-v`选项,如`arm-linux-gcc -v -o example example.c`,会显示详细的编译过程和版本信息。 6. `-g`选项,如`arm-linux-gcc -g -o example example.c`,添加调试信息,便于GDB等调试器使用。 7. `-Wall`选项,如`...
GCC编译过程解析
xiaowulang20082008的专栏
04-13 554
在编程过程中,我们经常会使用GCC(或交叉编译链)来编译代码,只有真正了解了GCC编译具体过程, 才能理解编译的精髓。 通常我们将gcc编译流程分为以下四个步骤: 1、预处理(Pre-Processing) 2、编译(Compiling) 3、汇编(Assembling) 4、链接(Linking) 以helloworld.c为例子,通过以上四个步骤中可分别生成h
使用gcc编译程序过程详解
akkk1kkka的博客
05-16 1796
1.gcc简介 GNU CC(通常简称GCC)是GNU项目的编译器,它能够编译C、C++语言编写的程序。 gccLinux开发的基础,gcc能够支持多种不同的C语言版本,同提供Linux、Unix、Windows下的编译版本。 使用gcc,程序员可以对编译过程有更多的控制,编译过程分为3个阶段: 预处理; 汇编; 链接。 程序员可以再编译的任何阶段结束后停止整个编译过程以检查编译器在该阶段输出的信息。 使用gcc,程序员可以控制生成二进制执行文件中调试代码的数量和类型。 和其他编译器一样,gcc也可以
GCC源码分析(十三) — 机器描述文件
ashimida
08-30 2923
gcc中,各个平台都有自己的机器描述文件,机器描述文件主要包括两种: ${target}.[md]:在aarch64平台为 ./config/aarch64/aarch64.md文件,此文件中主要记录的是aarch64平台的指令模板,此模板用来决定最终RTL是如何生成汇编代码的. ${target}.[ch]:在aarch64平台中为 ./config/aarch64/aarch64.h, ./config/aarch64/aarch64.c 两个文件.除了RTL=>汇编代码的指令...
gcc编译流程、参数实例详细(总结)
Luckiers的博客
04-04 2737
一、简介 本文主要讲解gcc命令的参数以及动态库和静态库的制作,通过程序的编译过程运行具体的实例进行阐述。 二、编译过程 GCC即GNU Compiler Collection,编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和链接(Linking),gcc可以理解为编译管理工具,它会具体调用相关的工具进行执行,具体如下图: 2.1预处理 [root@localhost /]# gcc -E test.c -o t
gcc怎么编写c语言程序,gcc如何编译C语言程序
weixin_35505629的博客
05-18 2470
gcc编译C语言程序的方法是什么,那么gcc如何编译C语言程序的呢/下面是学习啦小编收集整理的gcc如何编译C语言程序,希望对大家有帮助~~gcc编译C语言程序的方法编写c代码,并输入以下代码,生成文件hello.c[root@wahoo test]# vim hello.c#include#define DISPLAY "hello c!"int main(void){printf("%s\n"...
gcc 命令详解及最佳实践
热门推荐
人人都懂物联网
06-12 2万+
介绍 GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC 不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。 编译过程 GC
linux中用gcc编译代码的四个步骤(转载)
shijiemoxing的专栏
10-11 1万+
Linux下进行C语言编程,必然要采用GNU GCC编译C源代码生成可执行程序。 一、GCC快速入门 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件可缺省,Gcc默认生成可执行的文件名为:a.out 然后输入./a.
linux使用gcc命令编译代码
自由飞翔
05-02 705
<br />linux使用gcc命令编译代码 <br />关键字: linux使用gcc命令编译代码 <br />linux使用gcc命令编译代码<br />2008-11-13 00:30<br />初学最好从命令行入手,这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi/vim(个人觉得vim比vi好用)或其它编辑器编写。<br />      编译使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。<br />      gcc命令提供了非常多的命令选项,但并不是所有
GCC编译过程,了解编译原理
xunye的博客
12-09 3471
说明:这篇文件是在读《程序员的自我修养——链接、装载与库》的一点笔记,权当学习的记录。 1、GCC编译过程分解 以HelloWorld程序为例 2、预编译 规则: 命令:gcc -E XXX.c -o XXX.i   3、编译 词法分析、语法分析、语义分析及优化 ---------------&gt;&gt; 汇编代码文件 命令:gcc -S XXX.c -o ...
gcc编译会自动使用neon进行加速吗
05-31
GCC 编译器不会自动使用 NEON 进行加速,您需要使用特定的编译选项来启用 NEON。NEON 是 ARM 的 SIMD(单指令多数据)指令...总之,在 GCC 中启用 NEON 扩展需要使用特定的编译选项,并根据具体情况进行测试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • STM32下的LED灯闪烁 6487
  • STM32的定时器中断与实例 4508
  • STM32cubeMX的初始化以及初步调试 3290
  • linux下.a与.os文件的生成与使用 2168
  • STM32的串口通信及实例 2142

最新评论

  • 【无标题】

    CSDN-Ada助手: 恭喜作者第15篇博客的发布!虽然标题是“【无标题】”,但内容肯定是精彩的。希望作者能够继续保持创作的热情和勤奋,不断提升自己的写作技巧和表达能力。建议下一步可以尝试给博客起一个富有吸引力的标题,让读者在第一眼就被吸引过来。期待作者更加出色的作品!加油!

  • STM32cubeMX的初始化以及初步调试

    Cstupidme: 请问选择引脚时空白是怎么回事?

  • STM32的定时器中断与实例

    linlh11: 前面已经算过了,一次定时中断的时间是0.005秒,所以200次中断的时间是0.005*200=0.5秒。这句话中计算有错误,怎么能算出来是0.5秒呢,应该是0.005*200=1秒才正确。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 【无标题】
  • STM32的嵌入式实时操作系统编程
  • 【stm32的IIC和SPI协议及其实例】
2024年1篇
2022年14篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源都怪我歌词鼎字起公司名怎么起岛国片哪里可以看罗布泊之咒孙坚怎么死的浴场管理柳传志语录赵氏孤儿电影董姓宝宝起名大全免费缘起取名网蛟龙戏水小女孩起名姓张给科技公司起个名字禁果情人仓储管理软件书店起哪个名字好注册物流公司起什么名重生之资源大亨熊起名女孩宋词起名元卿凌宇文皓全文免费阅读起名字女孩姓苏让自己奔跑起来作文新生儿宝宝起名网华安创新吉庆街夜市秋天作文平凡的荣耀免费观看全集黄姓女猪宝宝起名星座日期淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化