一、 C语言编译过程

C语言的编译过程可分为四个阶段:

1、预处理(Preprocessing)

对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程。

伪指令包括:1)宏定义指令;

      2)条件编译指令;

      3)头文件包含指令;

2、编译(Compilation)

编译就是将源程序转换为计算机可以执行的二进制代码

说明:

  在Linux下,目标文件的缺省后缀为.o

  编译程序将通过词法分析和语法分析,将其翻译成为等价的汇编代码。

  在使用gcc进行编译时,缺省情况下,不输出这个汇编代码的文件。如果需要,可以在编译时指定-S选项。这样,就会输出同名的汇编语言文件。

3、汇编(Assembly)

汇编的过程实际上是将汇编语言代码翻译成机器语言的过程。

产生一个扩展名为.o的目标文件。

4、链接(Linking)

目标代码不能直接执行,要想将目标代码变成可执行程序,还需要进行链接操作。才会生成真正可以执行的可执行程序。

链接操作最重要的步骤就是将函数库中相应的代码组合到目标文件中。

二、文件名后缀

gcc可以针对支持不同的源程序文件进行不同的处理,文件格式以文件的后缀来识别。

文件名后缀

文件类型

.c

C源文件

.C .cpp .cc .c++ .cxx

C++源文件

.h

头文件

.i

预处理后的C源文件

.s

汇编程序文件

.o

目标文件

.a

静态链接库

.so

动态链接库

三、 gcc编译器简介

gcc(GNU Compiler Collection)

在Linux平台上最常用的C语言编译系统是gcc,它是GNU项目中符合ANSI C标准的编译系统。

gcc的使用格式:

   gcc [options][filenames]

说明:当不用任何选项时,gcc将会生成一个名为a.out的可执行文件。

例子:在linux上编译一个c程序(文件名为hello.c ;执行gcc hello.c)。

#include <stdio.h>

int main()

{

printf("hello world.\n");

return 0;

}

运行编译好的可执行c文件命令是./a.out

四、gcc编译器的工作过程

1、预处理(Preprocessing)

2、编译(Compilation & Assembly)

源代码转换为汇编语言(在编译时选择-S选项,可以看到生成的汇编代码.s文件)

汇编代码(.s)转换为目标代码(.o)

3、链接(Linking)

目标代码与各库函数进行链接并重定位,生成可执行程序。

五、gcc命令行选项

1、预处理选项

选项

说明

-D name

定义一个宏name,并可以指定值

-I dir

指定头文件的路径dir。先在指定的路径中搜索要包含的头文件,若找不到,则在标准路径(/usr/include,/usr/lib及当前工作目录)上搜索。

-E

只对文件进行预处理,不进行编译、汇编、链接,生成的结果送标准输出

即:只运行C预编译器

-o file

将输出写到指定的文件file中

即:产生目标(.i 、.s 、 .o 、可执行文件等)

例子:使用 -I选项包含保存在非标准位置中的头文件。

# gcc -I/usr/openwin/include file.c

例子:使用-D选项定义宏,其作用等价于在源文件中使用宏定义指令。

main()

{

        printf("display -D variable %s\n",DOPTION);

        printf("hello,everybody!!\n");

}

# gcc -D DOPTION='"testing -D"' hello.c

2、编译程序选项

选项

说明

-o file1 file2

将文件file2编译成可执行文件file1

如果未使用该选项,则可执行文件放在a.out

-S

只进行编译,不进行汇编,生成汇编代码文件扩展名为.s

即:告诉编译器产生汇编语言文件后停止编译

-c

只把源文件编译成目标代码.o,不进行汇编、链接。

用于实现对源文件的分别编译

-g

在目标代码中加入供调试程序gdb使用的附加信息

-v

显示gcc版本

-Wall

显示警告信息

例子:在gcc中使用-W控制警告信息。

# gcc -Wall -o hello1 hello1.c

例子:使用gcc的-g选项来产生调试符号,

# gcc -g -o test1 test1.c 

例子:多文件的编译。

//meng1.c

#include <stdio.h>

main()

{

int r;

printf("enter an integer,please!\n");

scanf("%d",&r);

square(r);

return 0;

}

//meng2.c

#include <stdio.h>

int square(int x)

{

printf("The square=%d\n",x*x);

return (x*x);

}

编译方法一:

# gcc -c meng1.c

# gcc -c meng2.c

# gcc meng1.o meng2.o -o meng12

编译方法二:

# gcc -o meng13 meng1.c meng2.c

说明:

方法二不产生中间目标文件,直接生成一个可执行文件,因而,程序内容稍有改动,就要重新编译全部程序。

3、优化程序选项

优化是编译器的一部分,它可以检查和组合编译器生成的代码,指出未达到最优的部分,并重新生成它们,从而使用户编写的程序更加完美且节省空间。

在gcc编译器选项中,使用-O选项对代码进行优化。

优化级别分3级,由高到低分别为:-O3、-O2、-O1

优化程序选项

选项

说明

-O1(-O)

对编译出的代码进行优化

-O2

进行比-O高一级的优化

-O3

产生更高级别的优化

说明:

-O1(或-O)、-O2、-O3分别代表优化级别,数字越高,代表gcc的优化级别越高,高的优化级别代表着程序将运行的更快。

优化级别越高则程序量越大。

直接优化程序本身,性能的提高的变化更加明显。

4、连接程序选项

是一组预先编译好的函数集合。

说明:

标准库文件一般存储在/lib和/usr/lib目录中。

所有的库名都以lib开头。例如:libc.so(标准C语言函数库)、libm.so(数学运算函数库)

以.a结尾的是静态库;以.so结尾的库是动态库。

使用ar工具将目标文件收集起来,放到一个归档文件中。

连接程序选项

选项

说明

-L dir

将dir所指出的目录加到“函数库搜索列表”中

-llib

链接lib库

-I name

连接时,加载名字为name的函数库。该库位于系统预设的目录或者由-L选项确定的目录下。

实际的库名是libname(后缀为.a或.so)

说明:

链接过程通常的形式如下:

gcc -o file file.o -L dirname -lxxx

-L:指定了链接时用到的库文件所在的目录。

-lxxx:指示链接的库函数名为libxxx.a

例子:编译产生可执行文件hello,搜索数学库以解决问题。

# gcc -o hello hello.c /usr/lib/libm.a

或者

# gcc -o hello hello.c -lm 

例子:创建一个小型库

包含两个函数pro1、pro2,然后在示例程序中调用其中一个函数。

/* pro1.c */

#include <stdio.h>

void pro1(int arg)

{

printf("hello:%d\n", arg);

}

/* pro2.c */

#include <stdio.h>

void pro2(char *arg)

{

printf("welcome to:%s", arg);

}

/* lib.h */

void pro1(int);

void pro2(char *);

/* program.c */

#include "lib.h"

int main()

{

pro2("Linux world.");

exit(0);

}

gcc编译系统的更多相关文章

  1. GCC编译器原理(一)------交叉编译器制作和GCC组件及命令

    1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码.安装一些必须的模块,就可产生多种目标机器代码,而且可 ...

  2. oracle linux了解基本命令行

    1.      Linux的版本:核心(kernel)版本和发行(distribution)版本 2.      复制.删除和移动文件的命令 cp [选项] 源文件或目录  目标文件或目录 -R,-r ...

  3. (转)C的代码是如何变成程序的

    原文链接:http://blog.csdn.net/fz_ywj/article/details/8769825 C语言是一门典型的编译语言,源代码文件需要编译成目标代码文件才能运行.可以认为程序文件 ...

  4. 转:GCC,LLVM,Clang编译器对比

    GCC,LLVM,Clang编译器对比   转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...

  5. 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)

    第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...

  6. GCC 编译详解

    GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...

  7. 暑假热身 A. GCC

    GCC编译器是一个由GNU项目维护的编译系统,它支持多种编程语言的编译.但是它并不包含数学运算符“!”.在数学中,这个符号代表阶乘.表达式n!的意思是从1到n的所有整数的乘积. 例如,4!=4*3*2 ...

  8. windows下安装,配置gcc编译器

    在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...

  9. Linux 内核的编译系统

    Linux  的编译使用 GNU make 工具来检查整个系统的文件和调用 gcc 工具以及脚本完毕编译源码生成 image 等操作.要了解整个编译系统,我们首先要了解 Linux 内核的 Makef ...

随机推荐

  1. HDU 4334 5-sum

    题目大意: 从5个集合中个选取一个数出来,使5个数相加之和为0 , 判断是否存在这种可能 因为集合数目最多200,那么200^3 = 8000000 , 那么这里很明显要把5个数拆成2个和3个计算,因 ...

  2. ng-repeat的作用域问题

    ng-repeat会创建一个子作用域,所以在ng-repeat下面要使用参数时,要用$parent.XXXX参数. 示例如下:

  3. 【BZOJ1834】network 网络扩容(最大流,费用流)

    题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. ...

  4. BZOJ1777: [Usaco2010 Hol]rocks 石头木头

    n<=10000的树,节点有初始石头数<=1000,进行这样的游戏:两人轮流行动,我先手,每次可以选一个节点(≠1)把不超过m<=1000个石头移到父亲,最后所有石头都在节点1,没法 ...

  5. poj2553 有向图缩点,强连通分量。

    //求这样的sink点:它能达到的点,那个点必能达到他,即(G)={v∈V|任意w∈V:(v→w)推出(w→v)} //我法:tarjan缩点后,遍历点,如果该点到达的点不在同一个强连通中,该点排除, ...

  6. Swift--错误集:Class controller has not initializers

    bug错误图 解决方法: 如下图所示,visitor这个属性并没有拆包处理,及将UIViewController的子类中的变量全部进行拆包处理,就是在变量声明的时候加一个?号,在使用的时候拆包处理,加 ...

  7. iOS React Native 环境的搭建

    react native 的官网:http://reactnative.cn/docs/0.47/getting-started.html#content  --iOS如何搭建mac版的环境 1.配置 ...

  8. ACM-ICPC 2018 焦作赛区网络预赛 H、L

    https://nanti.jisuanke.com/t/31721 题意 n个位置 有几个限制相邻的三个怎么怎么样,直接从3开始 矩阵快速幂进行递推就可以了 #include <bits/st ...

  9. Codeforces Beta Round #57 (Div. 2) E. Enemy is weak

    求满足条件的三元组的个数,可以转换求一元组和二元组组成的满足条件的三元组的个数,且对于(x),(y,z),x > y,且x出现的p_x < p_y. x可直接枚举O(n),此时需要往后查询 ...

  10. Spring中基于AOP的XML架构

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-wi ...