从零开始学Linux_11_gcc入门(上)

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢微笑



一、什么是gcc
1、 gcc GNUC Compiler )编译器的作者是 RichardStallman ,也是 GNU 项目的奠基者。
2、 什么是 gcc gcc GNUCompiler Collection 的缩写。最初是作为 C 语言的编译器( GNUC Compiler ),现在已经支持多种语言了,如 C C++ Java Pascal Ada COBOL 语言等。
3、 gcc 支持多种硬件平台,甚至对 DonKnuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持


二、gcc特点
1、 gcc 是一个可移植的编译器,支持多种硬件平台
2、 gcc 不仅仅是个本地编译器,它还能跨平台交叉编译。
3、 gcc 有多种语言前端,用于解析不同的语言。
4、 gcc 是按模块化设计的,可以加入新语言和新 CPU 架构的支持
5、 gcc 是自由软件


三、gcc编译过程
1、预处理(Pre-Processing
2、 编译( Compiling ):生成汇编程序
3、 汇编( Assembling ):将汇编程序生成二进制目标程序
4、 链接( Linking

5、gcc编译程序过程示意图

从零开始学Linux_11_gcc入门(上)_第1张图片

    hello程序是一个高级C语言程序,这种形式容易被人读懂。为了在系统上运行hello.c程序,每条C语句都必须转化为低级机器指令。然后将这些指令打包成可执行目标文件格式,并以二进制形式存储器于磁盘中。



四、gcc常用选项

选项名

作用

-o

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

-c

通知gcc取消链接步骤,即编译源码并在最后生成目标文件

-E

只运行C预编译器

-S

告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s

-Wall

使gcc对源文件的代码有问题的地方发出警告

-Idir

将dir目录加入搜索头文件的目录路径

-Ldir

将dir目录加入搜索库的目录路径

-llib

链接lib库

-g

在目标文件中嵌入调试信息,以便gdb之类的调试程序调试


1、gcc示例
(1)、 gcc -E hello.c -o hello.i (预处理)
(2)、 gcc -S hello.i -o hello.s (编译)
(3)、 gcc -c hello.s -o hello.o (汇编,生成可重定位目标文件
(4)、 gcc  hello.o -o hello (链接,成可执行目标文件
(5)、 gcc  hello.c -o hello (直接编译链接成可执行目标文件)
(6)、 gcc -c hello.c gcc -c hello.c -o hello.o (编译生成可重定位目标文件

2、-Wall使用
(1)建议初学都加这个选项。下面这个例子如果不加-Wall选项编译器不报任何错误,但是得到的结果却不是预期的。

#include<stdio.h>

int main(void)

{

        printf("Twoplus two is %f", 4);

        return 0;

}



五、gcc编译多文件
1、存在三个文件
hello_fn.h
hello_fn.c
main.c

2、一次性编译
(1)gcc   hello_fn.c main.c –o newhello

3、独立编译
(1)gcc -Wall -c main.c -o main.o
(2)gcc -Wall -c hello_fn.c -o hello_fn.o
(3)gcc -Wall main.o  hello_fn.o -o newhello

4、 独立编译的好处在于
   假如现在修改了main.c的程序,采用独立编译的话,由于hello_fn.c没有修改,不需要编译 hello_fn.c。仅需要编译main.c:gcc -Wall -c main.c -o main.o。而采用一次性编译的话,每次都会编译hello_fn.c和main.c,相当于多编译了一次hello_fn.c。对于大型程序来说,采用独立编译可以很好的降低编译的时间。

你可能感兴趣的:(linux,gcc)