欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢
一、什么是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编译过程
2、
编译(
Compiling
):生成汇编程序
3、
汇编(
Assembling
):将汇编程序生成二进制目标程序
4、
链接(
Linking
)
5、gcc编译程序过程示意图
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。对于大型程序来说,采用独立编译可以很好的降低编译的时间。