GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

  1. 将C语言源程序预处理,生成.i文件。
  2. 预处理后的.i文件编译成为汇编语言,生成.s文件。
  3. 将汇编语言文件经过汇编,生成目标文件.o文件。
  4. 将各个模块的.o文件链接起来生成一个可执行程序文件。

GCC 编译流程如下图所示:

.i文件、.s文件、.o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经经它们删除了。

当然,可以使用 GCC 选项看到这些中间文件,下节我们会讲解 GCC 选项。

linux下使用gcc命令编译代码

gcc命令提供了非常多的命令选项,但并不是所有都要熟悉.初学时掌握几个常用的就可以了,到后面再慢慢学习其他命令选项.

一,常用编译命令选项

假设源程序文件名为test.c

1.无选项编译链接

用法: #gcc test.c

作用: 将test.c预处理 汇编 编译 并链接形成可执行文件。这里未指定输出文件,默认输出为a.out 编译成功后可以看到生成了一个a.out的文件.在命令行输入./aout 执行程序 。 ./表示在当前目录, a.out为可执行程序文件名

2.选项 -o

用法: #gcc test.c -o test

作用: 将test.c预处理 汇编 编译并链接形成可执行文件test 。 -o选项用来指定输出文件的文件名。输入./test执行程序

3.选项 -E

用法: #gcc -E test.c -o test.i

作用: 将test.c 预处理输出test.i 文件

4.选项 -S

用法: #gcc -S test.i

作用: 将汇编输出文件test.i 汇编成 test.s 文件

5.选项 -c

用法: #gcc -c test.s 编译输出 test.o 文件

6.选项 -0

用法: #gcc -01 test.c -o test

作用: 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,单编译时间越长,输出./test执行程序

二 多源文件的编译方法

如果有多个源文件,基本上有两种编译方法:

[假设有两个源文件为test.c 和 testfun.c]

1.多个文件一起编译

用法: #gcc testfunc.c test.c -o test

作用: 将testfun.c 和test.c 分别编译后 链接成 test可执行文件.

2.分别编译各个源文件,之后对编译后输出的目标文件链接

用法: #gcc -c testfunc.c //将testfun.c 编译成testfun.o

  #gcc -c test.c //将test.c 编译成 test.o

  #gcc -o testfunc.o test.o -o test //将testfun.o和test.o 链接成 test

以上两种方法比较,第一种方法编译是需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译.

转: http://c.biancheng.net/view/663.html

https://wenku.baidu.com/view/7ae93b68a45177232f60a2c6.html

GCC编译流程及常用编辑命令的更多相关文章

  1. GCC编译流程浅析

    GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...

  2. GCC 编译流程简介

    GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...

  3. gcc编译流程

    gcc的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 以hello.c为例子,在这四个步骤中 ...

  4. 和菜鸟一起学c之gcc编译过程及其常用编译选项【转】

    转自:http://blog.csdn.net/eastmoon502136/article/details/8162626 版权声明:本文为博主东月之神原创文章,未经博主允许不得转载. 上篇文章,知 ...

  5. vi 常用编辑命令

    什么是vi: vi是Linux/Unix底下最常用的文本编辑器,可以理解为和Windows下的txt一样,咱们一般操作linux服务器的时候都是没有图形化界面的, 怎么移动光标,到哪个位置,替换修改什 ...

  6. gcc 编译流程分析

    //test.c #include<stdio.h> int main() { ,y=; printf("x=%d y=%d\n",x,y); ; } 1:预处理阶段, ...

  7. 面试题----gcc的编译流程

    gcc编译流程 一.    编译与处理指令: gcc -E hello.c -o a.c 如果不使用-o指定输出的文件,会默认输出到终端.所以建议使用同时使用-o选项. 还要注意:编译时会保留#pra ...

  8. EDKII Build Process:EDKII项目源码的配置、编译流程[三]

    <EDKII Build Process:EDKII项目源码的配置.编译流程[3]>博文目录: 3. EDKII Build Process(EDKII项目源码的配置.编译流程) -> ...

  9. gcc编译代码报错及编译方式

    一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错, ...

随机推荐

  1. Nginx作为缓存服务

    缓存类型 (1) 服务器缓存 服务端缓存一般使用Memcache.Redis (2)代理缓存 (3)客户端缓存 代理缓存流程图 第一步:客户端第一次向Nginx请求数据a: 第二步:当Nginx发现缓 ...

  2. Django之简介

    一.MVC模型与MTV模型 MVC模型就是Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...

  3. Java--8--新特性--Stream API

    Stream API 提供了一种高效且易于使用的处理数据的方式,(java.util.stream.*) 他可以对数组,集合等做一些操作,最终产生一个新的流,原数据是不会发生改变的. “集合”讲的是数 ...

  4. LESS简介与使用方法

    less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 一.传统写法与 less 写法对比 1. 传统 css 写法: .con ...

  5. 【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重

    L2-002. 链表去重 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须 ...

  6. Java原子类--框架

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...

  7. idea远程debug调试阿里云ECS

    1.首先远程服务器的代码跟本地项目代码应该完全一致,否则会出现debug混乱现象,亲测. 2.config如图: ①命名可以省略②复制这个地址③输入远程ip和自定义且未被占用的端口号xxxx 3.开放 ...

  8. js字符串解析与转换成数字

    解析允许字符串中含有非法数字字符,解析按从左至右的顺序,如果遇到非数字字符就停止.而转换不允许出现非数字字符,否则会失败并返回NaN

  9. [ Educational Codeforces Round 65 (Rated for Div. 2)][二分]

    https://codeforc.es/contest/1167/problem/E E. Range Deleting time limit per test 2 seconds memory li ...

  10. Java链接Redis时出现 “ERR Client sent AUTH, but no password is set”

    Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法. [错误提示] redis.clients.jedis ...