02.GCC编译器的使用

一、GCC编译过程

一个C/C++文件要经过预处理(preprocessing)编译(compilation)汇编(assembly)链接(linking)等4步才能变成可执行文件。

gcc编译器可以通过指定不同的编译选项从而控制整个过程 

02.GCC编译器的使用_第1张图片

(1)预处理

C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

(2)编译

编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为cc1(它的名字就是cc1,x86有自己的cc1命令,ARM板也有自己的cc1命令)。

(3)汇编

汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件),用到的工具为as。x86有自己的as命令,ARM版也有自己的as命令,也可能是xxxx-as(比如arm-linux-as)。

“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。

(4)链接

链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为ld或collect2。

二、 单步执行整个编译过程     

          程序代码如下:

#include 

#define MAX 20
#define MIN 10

//#define _DEBUG

int main(int argc,char *argv[])
{
	printf("Hello world\r\n");
	printf("MAX = %d,MIN = %d,MAX + MIN = %d\r\n",MAX,MIN,MAX + MIN);

#ifdef _DEBUG
	printf("Hello world\r\n");
    printf("MAX = %d,MIN = %d,MAX - MIN = %d\r\n",MAX,MIN,MAX - MIN);
#endif

	return 0;
}

预处理: 

gcc -E -o hello.i hello.c 

表示将hello.c文件进行预处理,所有信息都存放在hello.i中。

02.GCC编译器的使用_第2张图片

02.GCC编译器的使用_第3张图片

        打开生成的hello.i,文件发现在预处理阶段已经将需要包含的头文件包含,宏定义进行了展开。现在将程序中的_DEBUG宏定义打开,发现条件编译的内容出现了。

02.GCC编译器的使用_第4张图片

编译: 

gcc -S -o hello.s hello.i 

 使用如上命令可以将预处理过后的内容进行编译生成.s文件,文件内容如下:

02.GCC编译器的使用_第5张图片

汇编: 

gcc -c -o hello.o hello.s

使用如上命令将.s文件可以编程.o文件,即汇编过程。

链接:

gcc -o hello hello.o

最后一步不加任何参数,就可以将系统.o文件和你编写的.o文件链接成可执行的APP

三、 常用编译选项

常用选项

描述

-E

预处理,开发过程中想快速确定某个宏可以使用“-E  -dM”

-c

把预处理、编译、汇编都做了,但是不链接

-o

指定输出文件

-I

指定头文件目录

-L

指定链接时库文件目录

-l

指定链接哪一个库文件

通常先使用命令:

        gcc -c -o main.o main.c命令把预处理、编译、汇编都完成,最后再自行使用gcc -o xxx.o进行链接。 


注意:

        gcc编译器在与处理的过程中不会检查你的错误,是在编译那一步检查错误的。

你可能感兴趣的:(linux应用,linux)