C/C++知识点之用gcc编译c语言程序以及其编译过程
小标 2018-09-18 来源 : 阅读 1037 评论 0

摘要:本文主要向大家介绍了C/C++知识点之用gcc编译c语言程序以及其编译过程,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之用gcc编译c语言程序以及其编译过程,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

1、预编译 --> 2、编译 --> 3、汇编 --> 4、链接-----------------------------------------------------------------------------
0、编写c代码,并输入以下如图代码,生成c文件hello.c。

-----------------------------------------------------------------------------
1、预编译(Preprocessing)命令:
会对各种预处理指令(#include、#define、#ifdef 等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码。
gcc -o hello.i hello.c -E 或者 gcc -o hello.i -E hello.c 或者 gcc -E hello.c -o hello.i(注意:-o 作用是指定输出文件的名字,如果不加-o的话,则生成的文件名字总叫a.out。)
(即-o 参数:是对命令输出结果进行导入操作,这里是把 gcc -E hello.c 操作结果输出到文件hello.i(命名可以自定义)中进行保存。)
预编译hello.c,预编译之后得到的文件的名字叫hello.i。
(注意:编译后的名字可以随意起,但是呢我们知道预编译后的文件还是文本的.c文件,所以为了好区分起名字为 xxx.c,这里我们为了显示整个过程,预编译后的文件名我们起为xxx.i。)
在c语言中#开头的语句又叫预编译指令。例如:#include 
预编译的功能之一:会把include包含的头文件内容做一个简单的替换,即替换到.c文件里面去。......//此处省略1万行......预编译的功能之二:会把代码中的注释去掉。

-----------------------------------------------------------------------------2、编译(Compilation)的命令:
对代码进行语法、语义分析和错误判断,生成汇编代码文件。
gcc -o hello.s hello.i -S 或者 gcc -o hello.s -S hello.i 或者 gcc -S hello.i -o hello.s
(-S 参数:是gcc对目标文件进行编译,这里针对的是文件hello.i文件。)
通过这一步我们知道 C语言跟汇编的 关系,至于他们之前是如何进行转换的,大家可以进行更深入的学习与探讨。

此时目录下多了一个hello.s文件,内容如下图所示:
 
-----------------------------------------------------------------------------
3、汇编(Assembly)的命令:
把汇编代码转换成计算机可认识的二进制文件,即把文本的c语言编译为二进制指令。要知道计算机只认识0和1呢!
gcc -o hello.o hello.s -c 或者 gcc -o hello.o -c hello.s 或者 gcc -c hello.s -o hello.o
(-c 参数:是gcc对目标文件执行指令转换的操作。)

此步骤我们得到文件hello.o文件。
大家也同样打开文件(cat hello.o)查看一下,这个文件里面几乎没几个字符大家能看懂,这就对了,但大家可以通过这种方法将其转化为我们可读的形式:
root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# readelf -a hello.o

-----------------------------------------------------------------------------4、链接(Linking/Build)的命令:
通俗的讲就是把多个*.o文件合并成一个可执行文件,即二进制指令文件。
gcc -o hello hello.o  或者 gcc hello.o -o hello(注意:gcc没有单独的链接参数)
将系统库函数与hello.o进行链接(简言之合并),得到可执行的程序,该程序的名字叫hello。

root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# gcc -o hello hello.o 
这里我们就得到了一个可以直接在系统下执行的文件 hello。
我们也可以对这个文件进行readelf操作,也可以进行二进制指令转汇编的操作,如下图所示:
root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# objdump -d hello

-----------------------------------------------------------------------------
5、程序运行

我们想知道在linux系统下到底链接来了什么库来呢?(即可执行程序需要用到什么库呢?)使用命令 ldd hello 查看。

(注意;用c语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包。)

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程