一分钟搞懂Linux下的GCC编译
Linux下的GCC编译
GCC(GNU Compiler Collection)即GNU编译器套件,属于一种编程语言编译器,其原名为GCC(GNU C Compiler)即GNU c语言编译器,虽然缩写一样但是功能上区别很大。GCC的初衷是为GNU操作系统专门编写的一款编译器,原本的GNU是专用于编译C代码,现如今已扩展为可以编译C、C++、Java、Objective-C等多种编程语言的编译器集合了。
1.基本命令
gcc [options] [filenames] //其中[options]表示参数,[filenames]表示相关文件的名称。
常见参数
参数名称 | 含义 |
---|---|
-E | 仅执行预处理,不进行编译、汇编和链接(生成后缀为 .i 的预编译文件) |
-S | 执行编译后停止,不进行汇编和链接(生成后缀为 .s 的预编译文件) |
-c | 编译程序,但不链接成为可执行文件(生成后缀为 .o 的文件) |
-o | 直接生成可执行文件 |
2.gcc编译C语言过程示例:
可以使用以下命令一步完成所有编译步骤:
gcc hello.c -o hello //对hello.c文件生成可执行程序
./hello //运行
四步骤:
-
1、预处理:预处理,生成 .i 的文件[预处理器cpp]
-
2、编译:将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
-
3、汇编:将汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
-
4、链接:连接目标代码, 生成可执行程序 [链接器ld]
Step1:预处理(-E .i)
预处理通过对宏定义(像#define)进行展开,对头文件(像 stdio.h)进行展开,对条件进行(像ifdef)编译,展开所有宏,删除所有注释(像"//")。预处理cpp把源代码以及头文件预编成一个.i文件。命令如下:
gcc -E hello.c -o hello.i //-E只进行预处理,-o hello.i:这个选项指定了输出文件的名称。
Step2:编译(-S .s)
编译也就是检查语法是否错误,将预处理过的文件编译成汇编(.s)文件。命令如下:
gcc -S hello.i -o hello.s
Step3:汇编(-c .o)
汇编也就是将汇编(.s)文件生成目标文件(二进制文件)。通过汇编,文本代码变成了二进制代码(二进制代码文件以.o为后缀名)。命令如下:
gcc -c hello.s -o hello.o
Step4:链接
链接过程就是找到依赖的库文件(静态与动态),将目标文件链接为可执行程序。命令如下:
gcc [目标文件] -o [可执行程序] -l[动态库名]
假如没有动态库的话,直接使用以下命令:
gcc [目标文件] -o [可执行程序]
此例程即:gcc hello.o -o hello
假如没有动态库的话,直接使用以下命令:
gcc [目标文件] -o [可执行程序]
此例程即:gcc hello.o -o hello