一、gcc概述
计算机内部只认识高低电平(机器语言),非常傻瓜。
高级语言:人与人的交流的协议、代码。
翻译官/翻译组织:把人能理解的高级语言翻译成机器语言。
GCC:最初的全名:GNU C Compiler
随着GCC支持的语言越来越多,它的名称就变成了GNU Compiler Collection。
gcc根据后缀名选择翻译组织中的成员。
二、常用选项
1. gcc -v
打印版本信息。
2. gcc -o
编译运行。
gcc -o outputFile inputFile
gcc inputFile -o outputFile
// -o与outputFile是整体,中间不能放任何选项。
例子:
-
hello.c
#include <stdio.h> #define PRICE 10 int main() { int price = PRICE; printf("hello world\n"); return 0; }
编译
gcc -o build hello.c运行
./build
3. gcc -v -o
gcc -v -o build hello.c
把gcc中涉及到的翻译组织(调用的翻译工具)都会进行展现。有打印信息的每个细节。
主要工具:
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 // cc1:编译器
as -v --64 -o /tmp/cc3S8uyK.o /tmp/ccnVw5oU.s // as:汇编器
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 // collect2:链接器
三、C语言的编译过程
1、预处理
预处理是技巧性的东西,可以省时省力的一些机制。
cpp -o hello.i hello.c // cpp:生成预处理文件。
【gcc -E -o hello.i hello.c】
2、编译
编译的过程中,已经没有define和include等了。它是编译关键字和运算符。
(define和include在预处理时已处理完了,因此define和include并不是关键字。)
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o a.s hello.c
【gcc -S -o a.s hello.c】:该选项相当于间接调用了上述命令。
3、汇编
as -o a.o b.s
【gcc -c a.o b.s】:该选项相当于间接调用了上述命令。
【gcc -c a.o a.c】:直接完成编译和汇编的过程。
4、链接
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o build a.o b.o c.o …
【gcc -o】
gcc -o build hello.c:先调用-S,再调用-c,最后调用-o。
例子:
1、-E预处理,生成hello.i
gcc -E -o hello.i hello.c
2、-S编译,生成hello.s(汇编文件)
gcc -S -o hello.s hello.i
// gcc -S -o hello.s hello.c
3、-c汇编,生成hello.o(机器二进制文件)
gcc -c -o hello.o hello.s
// gcc -c -o hello.o hello.c
4、-o链接,生成build(可执行文件)
gcc -o build hello.o
// gcc -o build hello.c