一般所说的GCC是GUN Compiler Collection的简称,除了编译程序以外,它还含其他有关东西,所以它能把易于人类运用的高档言语编写的源代码构建成核算机能够直接履行的二进制代码。GCC是Linux渠道下最常用的编译程序,它是Linux渠道编译器的事实规范。一同,在Linux渠道下的嵌入式开发范畴,GCC也是用得最遍及的一种编译器。GCC之所以被广泛选用,是由于它能支撑各种不一样的方针体系结构。例如,它既支撑根据宿主的开发(简略讲即是要为某渠道编译程序,就在该渠道上编译),也支撑穿插编译(即在A渠道上编译的程序是供渠道B运用的)。当时,GCC支撑的体系结构有四十余种,多见的有X86系列、Arm、PowerPC等。一同,GCC还能运转在不一样的操作体系上,如Linux、Solaris、Windows等。
除了上面讲的以外,GCC除了支撑C言语,还支撑多种其他言语,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。
GCC的装置:
Ubuntu等根据Debian发行版Linux能够运用如下指令装置:
apt -get install gcc
Fedora等根据RPM发行版Linux能够运用如下指令装置:
yum install gcc
运用如下指令查看gcc的版别:
gcc --version
二、程序的编译进程
关于GUN编译器来说,程序的编译要阅历预处理、编译、汇编、衔接四个期间,如下图所示:
从功用上分,预处理、编译、汇编是三个不一样的期间,但GCC的实习操作上,它能够把这三个进程合并为一个进程来履行。下面以C言语为例来谈一下不一样期间的输入和输出状况。
GCC编译器的根本选项如下表:
类型阐明-E预处理后即中止,不进行编译、汇编及衔接-S编译后即中止,不进行汇编及衔接-c编译或汇编源文件,但不进行衔接-o file指定输出文件file
在预处理期间,输入的是C言语的源文件,一般为*.c。它们一般带有.h之类头文件的包含文件。这个期间首要处理源文件中的#ifdef、 #include和#define指令。该期间会生成一个中心文件*.i,但实习作业中一般不必专门生成这种文件,由于根本上用不到;若非要生成这种文件不行,能够运用下面的示例指令:
gcc -E test.c -o test.i
在编译期间,输入的是中心文件*.i,编译后生成汇编言语文件*.s 。这个期间对应的GCC指令如下所示:
gcc -S test.i -o test.s
在汇编期间,将输入的汇编文件*.s变换成机器言语*.o。这个期间对应的GCC指令如下所示:
gcc -c test.s -o test.o
终究,在衔接期间将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可履行的二进制代码文件。这一进程,能够运用下面的示例指令完结:
gcc test.o -o test
运转如下:
能够经过:cat -n [filename]指令查看每一个期间的文件内容
上面介绍了GCC编译进程的四个期间以及相应的指令。下面咱们进一步介绍常用的GCC的方法。
三、正告选项
GCC供给了许多的正告选项,对代码中或许存在的疑问提出正告,一般能够运用-Wall来敞开以下正告
GCC的编译器正告选项如下表:
类型阐明-Wall启用悉数正告信息-Werror在发作正告时撤销编译操作,行将正告看作是过错-w禁用悉数正告信息
实例1:给出一段代码,运用gcc进行编译,一同敞开正告信息(test1.c)
#include
运用-Wall敞开正告:
从上面能够看出,GCC给出了正告信息,意思是main函数的回来值被声明为int,可是没有回来值,GCC并不是简略的宣布正告,会中止悉数编译进程
假如不想看到正告信息,能够运用-w来制止悉数的正告。
此外,GCC还供给了许多以-W最初的选项,答运用户指定输出某个特定的正告,例如:
-Wcomment:呈现注释嵌套时宣布正告。
-Wconversion:假如程序中存在隐式类型变换,则宣布正告。
-Wformat:查看printf和scanf等格局化输入输出函数的格局字符串和参数类型的匹配状况,假如发现不匹配则宣布正告。
-Winline:假如函数不能被内联,则宣布正告。
-Wlong-long:假如运用了long long型数据,则宣布正告。
-Wmain:假如main函数的回来类型不是int型,或许调用main函数时运用的参数数目不精确,则宣布正告。
-Wmissing-declarations:假如界说了大局函数,但却没有在头文件中声明,则宣布正告。
-Wparentheses:在某些状况下,假如疏忽掉了括号,则会宣布正告。
-Wreturn-type:假如函数界说了回来类型,而默许类型是int型,编译器会宣布正告。
-Wuninitialized:假如运用的主动变量没有被初始化,则宣布正告。
-Wundef:假如在#if宏中运用了未界说的变量做判别,则宣布正告。
-Wunused:假如声明的变量或static型函数没有运用,则宣布正告。
实例2:给出一段代码,运用gcc进行编译,一同敞开正告信息(test2.c)
#include
运用-Wparentheses敞开正告:
四、优化选项
GCC具有优化代码的功用,首要的优化选项包含如下:
-O0:不进行优化处理。-O或-O1:进行根本的优化,这些优化在大大都状况下都会使程序履行得更快。-O2:除了完结-O1等级的优化外,还要一些额定的调整作业,如处理器指令调度等,这是GNU发布软件的默许优化等级。√-O3:除了完结-O2等级的优化外,还进行循环的打开以及其他一些与处理器特性有关的优化作业。-Os:生成最小的可履行文件,首要用于在嵌入式范畴。
一般来说,优化等级越高,生成可履行文件的运转速度也越快,但耗费在编译上的时刻就越长,因而在开发的时分最佳不要运用优化选项,到软件发行或开发完毕的时分才思考对终究生成的代码进行优化。
-finline-functions:答应编译器将一些简略的函数在其调用途打开。-funswitch-loops:将循环体中值不改动的变量移到循环体外。
实例:给出一段代码,运用gcc进行编译,一同对比优化前后履行程序所花的时刻(test3.c)
#include
运转后的成果如下:
能够看到,优化的作用非常的明显