Gcc 和 Clang

GCC是Linux下标准的C/C++编译器。
命令是gcc。

常用的选项包括-E预处理、-c编译成.o文件、-S生成程序集.s文件、-o指定输出名称。

默认输出称为a.out。
源文件变为.o,汇编文件变为.s。

使用-m3 2 生成3 2 位代码。
int 和指针 3 2 位。
long也是3 2 位。

-m6 4 生成 6 4 位代码。
int仍然是3 2 位。
long 和指针都是 6 4 位。

-m1 6 是 1 6 位模式。
将在汇编文件的开头添加一个特殊标记。

编译分为四个步骤:预处理、编译、汇编、链接。

使用cpp命令进行预处理。
展开宏定义。
Sample.i是预处理结果。

-D可以自定义宏。
例如-DDEBUG。

汇编代码查看寄存器位宽。
3 2 位和6 4 位寄存器是不同的。

pushl 和 movl 是汇编指令。
Push 被压入堆栈。
mov 正在移动数据。

subl 是减法。
cmpl是比较。
je 是一个跳跃。

addl是加法。
sal 是逻辑左移。
ret是回报。

使用je等控制过程。
理解这些指令很重要。

-c 编译成机器代码。
使用 -o 指定文件名。

as 命令转换为机器代码。
objdump 查看汇编代码。

nm 命令查看符号定义。
可以快速发现符号冲突。

链接器ld将.o文件组合成可执行文件。

ld 解析符号。
例如main函数地址。

缺少 CRT 文件将会发出警告。
CRT 文件位于 /usr/lib/x8 6 _6 4 -linux-gnu 中。

_start是程序入口。
调用 __libc_start_main。

_init 在 main 之前执行。
_fini 在 main 之后执行。

使用 -lc 选项链接。
与 C 标准库的链接。

Clang 是 GCC 的替代品。
基于LLVM。

Clang编译过程与GCC类似。

Clang 编译速度很快。
错误诊断效果更好。

类型推断更高级。
你不知道,直到你经历过。

Clang 和 GCC 具有相似的结果。
但性能更好。

语言支持更全面。
具体优势要根据情况而定。

Linux GCC 如何查看及指定 C 语言标准

GCC编译器下载和安装教程(基于Linux平台)

如何查看Linux是否安装了gcc