gcc的常用选项与编译
gcc是Linux系统中著名的编译器,主要用于编译Linux下的C语言程序。
由于gcc支持多种语言,因此gcc能够支持多种文件后缀的编译。
后缀名 |
意义 |
.c |
C语言源文件 |
.C/.cpp/.cc/.cxx |
C++源文件 |
.h |
头文件 |
.m |
Object C源文件 |
.i |
已经预处理过的C源文件 |
.ii |
已经预处理过的C++源文件 |
.s |
汇编语言源文件 |
.o |
目标源文件 |
.a |
编译后的静态库文件 |
.so |
编译后的动态库文件 |
虽然支持多语言编译,但最常用的还是C语言与C++的编译。
编译方式为:
gcc [选项] 源文件名 [选项] 目标文件名
源文件即为需要编译的文件,目标文件即为编译后的文件(可自主命名)
采用默认方式编译源文件时,系统会生成a.out可执行文件。
例如:默认方式编译c语言文件hello.c。
gcc命令分类:gcc由12类选项,分别是总体选项、语言选项、预处理选项、汇编器选项、链接器选项、目录选项、警告选项、调试选项、优化选项、目标选项、机器相关选项、代码生成选项。
总体选项:总体选项是gcc中最常用的选项
参数名 |
意义 |
-E |
只进行预编译,不做其他处理 |
-c |
只编译不链接,生成目标文件“.o” |
-S |
只编译不汇编,生成汇编代码 |
-o outfile |
把输出文件输出到outfile里 |
-g |
在可执行程序中包含标准调试信息 |
-v |
打印出编译器内部编译过程的命令行信息和编译器的版本 |
-static |
链接静态库 |
-llibrary |
链接名为library的库文件 |
目录选项:目录选项用于搜索编译时头文件、库文件或者编译器其他参数的路径。
参数名 |
意义 |
-I dir |
在头文件的搜索路径列表中添加dir目录 |
-L dir |
在库文件的搜索路径列表中添加dir目录 |
-B prefix |
在何处寻找可执行文件、编译器自己的数据文件 |
警告选项:警告选项用于显示程序在编译时的警告信息。
参数名 |
意义 |
-ansi |
支持符合ANSI标准的所有C程序 |
-w |
关闭所有警告 |
-wall |
允许发出所有有用的警告信息 |
-werror |
把所有的警告转换成错误信息,并在出现错误时终止编译 |
-pedanti |
发布严格的ISO C和ISO C++所要求的所有警告 |
-pedanti -erroc |
在基本标准需要诊断时,在编译时存在未定义行为的某些情况下以及在某些其他情况下不会妨碍编译符合标准的有效程序的情况下发出错误 |
调试选项:调试选项用于用户程序的调试。
参数名 |
意义 |
-g |
产生调试信息,gdb能使用这些信息 |
-ggdb |
以本地格式输出调试信息,是gdb的扩展 |
-gstabs |
以stabs方式输出调试信息,但不包括gdb调试信息 |
-gstabls+ |
以stabs方式输出调试信息,但只有gdb能够读取这些信息 |
-gcoff |
以coff格式输出调试信息 |
-gxcoff |
以xcoff格式输出调试信息 |
优化选项:优化选项用于gcc对可执行代码进行优化操作,通常会用到的是0、00、01、02、03五种优化方式,通常来说,0后面的代表着优化的效果,数字越大,表示优化的内容越多。
*优化指的是编译时的优化,有时候为了实现程序的高效率执行,需要在程序代码上做代码级的优化。
使用方法为:gcc –o hello hello.c -01
-00表示没有优化
-01为缺省值
-03优化级别最高
gcc的编译流程:编译器输入的shi 程序的源文件,输出是可执行的文件或者可分发的二进制代码,中间过程便是编译器要完成的工作。其具体的编译流程为:
(源文件(输入))→预编译→编译和优化→汇编→链接→(可执行文件(输出))
源文件通常指存放可编辑代码的文件,如存放C、C++和汇编语言的文件。
目标文件是指经过编译器的编译生成的cpu可以识别的二进制代码,但是目标文件一般不能执行,因为其中的一些函数过程没有相关的指示和说明。
可执行文件就是目标文件与相关的库链接后的文件,它是可以执行的。
预编译:预编译过程就是将程序中引用的头文件包含进源代码中,并进行一些宏替换。此过程使用的选项是-E,作用是告诉编译器,当预处理结束后停止编译。
预处理的输入是源文件(即.c文件),输出是.i文件
命令:gcc –E 源文件 –o 目标文件
示例:预编译文件hello.c
编译:编译阶段是对代码的规范性和语法的正确性进行检查,并编译成汇编语言,使用选项为-S。
编译阶段的输入是.i文件,输出是.s文件
命令:gcc –S 源文件 –o 目标文件
示例:
可使用cat命令来查看hello.s的内容
汇编:汇编阶段是将汇编语言翻译成目标文件,使用的选项为-c。
汇编阶段的输入是上阶段生成的.s文件,输出是.o文件
命令:gcc –c 源文件 –o 目标文件
示例:
链接:链接阶段是将所有的目标文件以及相应的库文件编译成可执行文件,此阶段不需要选项,只需要指定生成的可执行文件名即可
链接阶段的输入是.o文件,输出是可执行文件
命令:gcc 源文件 –o 目标文件
示例:
此时,便可执行hello文件了
其实,以上这些分部的过程(hello.c→hello.i→hello.s→hello.o→hello)等价于由源文件直接生成目标文件的一步过程(hello.c→hello)
除此之外,还有一个gcc选项比较常用,即-g选项,用来生成调试信息。
无多余代码显示,表示文件无错误。
gcc编译C++文件
可使用gcc直接加选项编译
示例:
也可使用g++进行编译,g++是gcc中的一个工具,专门用来编译C++语言文件,编译选项和gcc的相同
示例:
但是,如何编译C++11文件呢?
示例:
或可使用命令g++ c11test.cpp -std=c++11 -o c11test来编译,由于我的gcc编译器是CentOS下的,已经是4.8版本的了,若gcc版本不是4.8的,则需要先升级gcc编译器再编译c++11文件。