1.四个过程
预处理(pre-processing) E
编译器将C源代码中的包含的头文件如stdio.h编译进来,替换宏。
编译(Compiling)S
gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。
汇编(Assembling) c
把编译阶段生成的”.s”文件转成二进制目标代码。
链接 (Linking)
链接到库中,生成可执行文件。
2.一次性完成
二、gcc常用选项
选项名 | 作用 |
---|---|
E | 激活预处理;头文件、宏等展开(.i文件) |
S | 激活预处理、编译;生成汇编代码(.s文件) |
c | 激活预处理、编译、汇编;生成目标文件(.o文件) |
o | 生成目标 |
Wall | 打开编译告警(所有) |
g | 嵌入调试信息,方便gdb调试 |
llib | 链接 lib 库 (这里是小写 L ) 相当于 C++ #pragma comment(lib, “xxx.lib”) |
Idir | 增加 include 目录 (这里是大写 i ) 头文件路径 |
LDir | 增加 lib 目录 (编译静态库和动态库) |
三、多模块编译
多模块编译中如果某一个模块发生了变化,只需要编译更改的模块即可
四、静态库与动态库
1.静态库(.a)
程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库,生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存。
gcc编译步骤:
(1)预处理
gcc –E xxxxx.c -o xxxxx.i
展开头文件
删除注释
(2)编译
gcc -> cc1
gcc –S xxxx.c –o xxxx.s
将C源代码编译为汇编语言
(3)汇编
gcc -> as
gcc –c xxxxx.c -o xxxxxx.o
将汇编文件汇编为二进制文件
(4)链接
gcc -> collect2
gcc xxxxx.c -> a.out
将多个二进制文件进行链接
改变二进制文件显示 == :%!xxd==
回到普通模式状态: == :%!xxd -r==