对于初学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 <stdio.h>

预编译的功能之一:会把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语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包。)

用gcc编译c语言程序以及其编译过程的更多相关文章

  1. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  2. go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?

    1.我们看执行编译go语言程序中命令,没有找到exe文件.

  3. gcc编译c语言程序

    编译:当前源代码编译成二进制目标文件(.obj文件) 链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件).   一个现代编译器的主要工作流程如下: 源程序 ...

  4. 如何使用emacs编写c语言程序,并编译运行

    vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...

  5. Linux编译C语言程序

    1.首先安装gcc包,运行C++程序,安装gcc-c++ 包 如果没有安装的自行进行安装 2.编辑C语言程序, 打印乘法口诀表 [root@Db1 c]# vim chengfa.c 在编辑界面中,输 ...

  6. VisualStudio基本使用(2)-使用VS2013来编译C语言程序

    切换到C语言程序所有目录,执行cl test.c

  7. Linux基本使用(1)-使用GCC编译C语言程序

  8. Sublime Text 3 中实现编译C语言程序

    这个是真坑,感觉用devc++写c程序特别的不爽,所以就用了sublime,但是,编译的时候又有不少问题, 下面就把我踩的坑记录下来 tools>Build System>New Buil ...

  9. 在Linux下使用gcc运行C语言程序

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具.本教程毫不犹豫地使用GCC来编译C程序. ...

随机推荐

  1. Structural Inference of Hierarchies in Networks(网络层次结构推断)

    Structural Inference of Hierarchies in Networks(网络层次结构推断) 1. 问题 层次结构是一种重要的复杂网络性质.这篇文章给出了层次结构的精确定义,给出 ...

  2. bzoj 3620: 似乎在梦中见过的样子

    Description "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回 ...

  3. 超级基础的python文件读取

    读取文件的两种方式: 1.使用os的open函数: import sys,os r=open("data1.txt","r+") fr=r.readlines( ...

  4. K:正则表达式之进阶

    子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...

  5. JavaScript实现ZLOGO: 用语法树实现多层循环

    原址: https://zhuanlan.zhihu.com/p/32571516 照例先上演示弱效果图. 演示地址照旧: 代码如下: 开始 循环4次 循环4次 前进50 左转90度 到此为止 右转9 ...

  6. Protobuf的简单介绍、使用和分析

      Protobuf的简单介绍.使用和分析   一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...

  7. 【转】Jenkins 安装与配置

    基本配置: 1.Linux安装配置jdk环境 1.1.上传到 Linux 服务器:例如: 上传至: cd /usr/local 1.2.解压: rpm -ivh jdk-8u111-linux-x64 ...

  8. 命令行替代工具 - Cmder配置

    Cmder 可搭配使用cmd here ( cmdhere.reg ) 1.   修改config\aliases文件:添加下列几行 l=ls --show-control-chars la=ls - ...

  9. Oracle 触发器的使用

    一.触发器的作用 触发器的作用类似拦截器.把一些针对数据库的DML操作(insert/update/delete/select)进行拦截,符合业务要求的进行操作,不符合要求的操作可以通过抛出异常来阻止 ...

  10. COM学习(三)——COM的跨语言

    COM是基于二进制的组件模块,从设计之初就以支持所有语言作为它的一个目标,这篇文章主要探讨COM的跨语言部分. idl文件 一般COM接口的实现肯定是以某一具体语言来实现的,比如说使用VC++语言,这 ...