GCC,真的很难学
因为我上课没好好听
什么是GCC
GCC,全称GNU Compiler Collection,指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。
原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC在发布后很快地得到扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,Go与其他语言。
许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。
GCC编译流程
GCC的编译流程分为四个步骤,分别为:
- 预处理 Pre-processing
- 编译 Compiling
- 汇编 Assembling
- 链接 Linking
预处理 Pre-processing
现有以下hello.c源代码
在预处理阶段,编译器将上述代码中的stdio.h编译进来,我们可以使用" -E "进行查看。
GCC指令的一般格式为: gcc [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可缺省,Gcc默认生成可执行文件,命为:编译文件.out
以下是hello.i文件的部分内容
由此可见,Gcc对hello.c进行预处理,把stdio.h的内容插入到了hello.i文件中。
编译 Compiling
在编译阶段中,Gcc会检查代码的规范性,检查无误后把代码翻译为汇编语言。我们可以使用-S选项查看。
以下是hello.s文件的内容
由此可见Gcc已经将其转化为汇编了。
汇编 Assembling
汇编阶段中Gcc将编译生成的.s文件转化为目标文件,我们可以使用-c选项进行查看。
链接 Linking
函数库
静态库
动态库
Gcc常用使用示例
- gcc -E hello.c -o hello.i
对hello.c文件进行预处理,生成hello.i文件 - gcc -S hello.i -o hello.s
对预处理文件进行编译,生成汇编文件hello.s - gcc -c hello.s -o hello.o
对汇编文件进行编译,生成目标文件hello.o - gcc hello.o -o hello
对目标文件进行链接,生成可执行文件hello.out - gcc hello.c -o hello
直接编译链接hello.c文件生成可执行文件 - gcc -c hello.c 或 gcc -c hello.c -o hello.o
编译生成可重定位目标文件
Gcc总体选项列表
后缀名 | 所对应的语言 |
---|---|
-o | 生成目标文件(.i、.s、.o、可执行文件等) |
-c | 只编译不链接,生成目标文件".o" |
-S | 只编译不汇编,生成汇编代码 |
-E | 只进行预编译,不做其他处理 |
-g | 在可执行程序中包含标准调试信息 |
-o file | 把输出文件输出到file里 |
-v | 打印出编译器内部编译个过程的命令行信息和编译器的版本 |
-I dir | 在头文件的搜索路径列表中添加dir目录 |
-L dir | 在库文件的搜索路径列表中添加dir目录 |
-static | 链接静态库 |
-llibrary | 链接library库文件 |