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

尽量使用动态库

posted @ 2023-02-09 21:30  Muling_m  阅读(180)  评论(0编辑  收藏  举报