GCC编译过程及常用命令
GCC编译过程
编写如下程序hello.c
作为示例
预处理--ccl(编译器)
- 将#开头的预处理语句转换后重新插入
- 删除所有注释
- 得到
hello.i
编译--ccl(编译器)
词法分析、语法分析等等内容,生成汇编代码hello.s
,默认AT&T格式,添加选项-masm=intel
可以生成intel格式,-fno-asynchronous-unwind-tables
生成无cfi宏的汇编指令更加易读。
下面的printf只有一个参数,被优化为puts了
汇编--as(汇编器)
翻译为机器指令hello.o
文件
-c选项可以直接从hello.s
或者hello.c
生成hello.o
链接--collect2(链接器)
默认动态链接,选项-static指定静态链接
这部分内容负责空间分配、符号绑定、重定位等
生成ELF文件,部分如下
参数
gcc -x lang file
设定文件所使用的语言,默认为c语言。
这样做会使gcc忽略文件扩展名,将.c
改为.abc
也无所谓。
可用的参数有:c
, objective-c
, c-header
, c++
, cpp-output
, assembler
, 与 assembler-with-cpp
。
例:
gcc -x c hello.abc
gcc -x none file
不主动设定文件使用的语言,要求其根据扩展名确定语言。
例:
gcc -x none hello.c
这里根据扩展名.c
会确定为C文件。
gcc -c file
只执行前三步,即预处理、编译、汇编,输出一个obj文件。
gcc -c hello.c
生成的文件为hello.o
gcc -S file
只执行前两步,即预处理和编译,生成汇编文件。
gcc -S hello.c
生成的文件名为hello.s
gcc -E file
只执行第一步:预处理,不生成文件,但是可以进行重定向到一个输出文件。
gcc -E hello.c > hello.txt
gcc -o file
指定一个输出目标。
gcc -c hello.c -o hello.o
gcc -pipe
使用pipe作为编译中的临时文件。
gcc -pipe -c hello.c -o hello.o
gcc -incllude file
包含某个文件,作用类似于#include
gcc -C
预处理后不删除注释信息。
gcc -static
使用静态链接(默认为动态)
gcc -share
尽量使用动态库