1序言
gcc是一个可移植的编译器,支持多种硬件平台;也不仅仅是一个本地编译器也是一个跨平台编译器;支持多张语言编译时按照模块化设计支持多种语言。
gcc编译过程:预处理(预处理器);编译(编译器);汇编(汇编器);链接(链接器);
gcc编译简化:参数ESc-->文件iso;
2实践
先建立一个c文件hello.c,并输入如下打印出"hello world!";
#include <stdio.h> int main(void)
{
printf("hello world!\n");
return 0;
}
2.1下面来记录一下gcc编译过程:
1>预处理阶段
gcc -E hello.c -o hello.i //使用-E参数表示编译只到预处理阶段,这个阶段生成的文件是后缀为i,也可以在-E前面加上-Wall参数显示编译信息(以下如此),初学者非常有用。
2>编译阶段
gcc -S hello.i -o hello.s //使用-S参数把预处理阶段生成的文件编译成汇编文件
3>汇编阶段
gcc -c hello.s -o hello.o //使用-c参数把汇编文件编译生成目标文件,这是二进制文件
4>链接阶段
gcc hello.o -o hello //目标文件链接生成可执行文件不用参数,此阶段会把相关的一些系统静态库动态库文件加入进来生成可执行文件
以上4个步骤也可以使用一条命令完成:
gcc hello.c -o hello //直接把c源文件编译成可执行文件
2.2gcc多文件编译
上面的例子是针对一个源文件的,但是往往我们在开发中是多个文件那这又怎么操作呢,下面把上面的代码拆分一下如下:
1.建立hello_fn.h文件,文件内容如下:
#ifndef _HELLO_FN_H
#define _HELLO_FN_H
void print(const char* str);
#endif
2.建立hello_fn.c文件,内容如下:
#include <stdio.h>
#include "hello_fn.h" void print(const char* str)
{
printf(str);
}
3.建立hello_main.c文件,内容如下;
#include "hello_fn.h" int main(void)
{
print("hello world!\n");
return 0;
}
下面分步骤生成目标文件在生成可执行文件:
gcc -Wall -c hello_fn.c -o hello_fn.o
gcc -Wall -c hello_main.c -o hello_main.o
gcc -Wall hello_fn.o hello_main.o -o hello_main
也可以一次性生成可执行文件:
gcc -Wall hello_fn.c hello_main.c -o hello_main
这样结果是一样,第一种方法适合多个目标文件其中一个模块发生变化此时只需要编译改变的模块最后在把所有的目标文件链接成可执行文件,现在假如hello_fn.c文件发生变化,只需要编译hello_fn.c为目标文件hello_fn.o,最后链接hello_main.o生成可执行文件。