GCC是用于Unix,Unix-like系统的编译器。不过,现在Windows下也出现了GCC的稳定移植版。这要感谢Internet上众多程序员的共同努力。
如今,在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,Cygwin和Djgpp。虽然,Djgpp是应用于DOS系统的,考虑到windows对DOS的兼容,所以也将Djgpp纳入其中了。
基本介绍
总体来说,MinGW,Cygwin和Djgpp各有特色,针对不同的应用场合,可以选择不同的移植版来满足需要。MinGW这个系列的移植,主要方向是让 GCC的Windows移植版能使用Win32API来编程。而Cygwin的目标是能让Unix-like下的程序代码在Windows下直接被编译。 至于Djgpp,则是想让DOS下也能用上GCC。
所以,对于开发人员不同的需求。选择合适的移植版会让工作变得轻松而高效。 。
gcc编译器使用教程
1、双击GCC安装包,mingw-get-setup.exe,点击Install安装
2、点击Change选择安装路径,尽量不要有中文和空格,
3、将package 下面的mingw-***和mingw32-***和msys-**。都勾选上,等待下载安装,直到勾选框全部变成土灰色。
4、找到安装目录的bin目录,将路径右键复制下来。
5、找到计算机,右键,属性。点击 高级系统设置
6、找到下面的 环境变量 点击
7、在系统变量里面找到 Path变量,双击出现下面输入框,在变量值的末尾添加刚刚复制的bin目录,并在最后加上英文状态下 的分号(;)。点击确定。
8、测试是否安装成功,在cmd命令提示符里面输入 gcc --help 回车键,出现以下信息,表示安装成功
9、EditPlus 3 安装完成之后的界面点击File 下的 new C/C++
10、出现以下测试代码,保存到指定目录,最后不要有空格和中文,我保存到E:/My/Test下面测试。文件名为test.c
11、命令提示符窗口进入到 E:/MyTest 下 用dir 命令显示当前目录下的所有文件。
12、使用gcc 命令编译 命令格式 如下 gcc test.c - o test 回车键,编译完成
13、直接输入test运行,输出hello,world.
测试完成
软件功能
一、Gcc编译器常用选项
1.编译选项
gcc有超过100个的编译选项可用。具体的可以使用命令man gcc察看
2.优化选项
用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。有很多的选项可以告诉GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的就是-O和-O2。-O选项告诉gcc对源代码进行基本优化。-O2选项告诉GCC产生尽可能小的和尽可能快的代码。还有一些很特殊的选项可以通过man gcc察看
3.调试和剖析选项
GCC支持数种调试剖析选项。在这些选项中最常用的是-g和-pg.-g选项告诉gcc产生能被GNU调试器(如gdb)使用的调试信息,以便调试用户的程序。-pg选项告诉gcc在用户的程序中加入额外的代码,执行时,产生gprof用的剖析信息以显示程序的耗时情况
二、使用GDB方法
1.在命令行中键入gdb并按回车就可以运行gdb了,启动gdb后,能在命令行上制定很多的选项,也可以下面的方式来运行gdb: gdb filename 用这种方式运行gdb时,能直接指定想要调试的程序。在命令行上健入gdb -h得到一个有关gdb的选项的说明简单列表
2.编译代码以供调试,为了使gdb工作,必须使程序在编译时包含调试信息,调试信息包含程序里的每个变量的类型,在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联
三、内容错误查找
1.运行 gdb bugging 命令,装入 bugging 可执行文件
2.执行装入的 bugging 命令
3.使用 where 命令查看程序出错的地方
4.利用 list 命令查看调用 gets 函数附近的代码
5.唯一能够导致 gets 函数出错的因素就是变量string,用print命令查看string的值
6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第11行处设置断
7.程序重新运行到第11行处停止,这时,我们可以用 set variable 命令修改 string 的取值
8.然后继续运行,将看到正确的程序运行结果
使用示例
一、示例代码
int main(void)
{printf("hello\n")
return 0
二、预编译过程
1.这个过程处理宏定义和include,并做语法检查
2.可以看到预编译后,代码从6行扩展到了910行
三、编译过程
这个阶段,生成汇编代码
四、汇编过程
1.这个阶段,生成目标代码
2.此过程生成ELF格式的目标代码
五、链接过程
链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存
六、程序运行
七、以hello.c为例子,在这四个步骤中可以设置选项分别生成hello.i, hello.s, hello.o以及最终的hello文件:
hello.c: 最初的源代码文件
hello.i: 经过编译预处理的源代码
hello.s: 汇编处理后的汇编代码
hello.o: 编译后的目标文件,即含有最终编译出的机器码,但它里
面所引用的其他文件中函数的内存位置尚未定义
hello / a.out: 最终的可执行文件
Gcc编译器结构
GCC的外部接口长得像一个标准的Unix编译器。使用者在命令列下键入gcc之程序名,以及一些命令参数,以便决定每个输入档案使用的个别语言编译器,并为输出程序码使用适合此硬件平台的组合语言编译器,并且选择性地执行连接器以制造可执行的程序
每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言〈RTL〉的后端。编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位〈buffer overflow〉的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。几乎全部的GCC都由C写成,除了Ada前端大部分以Ada写成
1、前端接口
前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递归语法解析器
直到2004年,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则
在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用"gimplifier"技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Single Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全域最佳化通用语言,适用于大多数的现代编程语言
2、中介接口
一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的最佳化包括消解死码、消解重复运算与全域数值重编码等。许多最佳化技巧也正在实作中
3、后端接口
GCC后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的字符尺寸、呼叫方式与大小尾序等。后端接口的前半部利用这些讯息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式
GCC的最佳化技巧依其释出版本而有很大不同,但都包含了标准的最佳化算法,例如循环最佳化、执行绪跳跃、共通程序子句消减、指令排程等等。而RTL的最佳化由于可用的情形较少,且缺乏较高阶的资讯,因此相比较起来,增加的GIMPLE语法树形式,便显得比较不重要
后端经由一次重读取步骤后,利用描述目标处理器的指令集时所取得的信息,将抽象暂存器替换成处理器的真实暂存器。此阶段非常复杂,因为它必须关注所有GCC可移植平台的处理器指令集的规格与技术细节
后端的最后步骤相当公式化,仅仅将前一阶段得到的汇编语言代码藉由简单的子例程转换其暂存器与内存位置成相对应的机器码
Gcc编译器文件类型
.c为后缀的文件,C语言源代码文件
.a为后缀的文件,是由目标文件构成的档案库文件
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理
.h为后缀的文件,是程序所包含的头文件
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理
.m为后缀的文件,是Objective-C源代码文件
.mm为后缀的文件,是Objective-C++源代码文件
.o为后缀的文件,是编译后的目标文件
.s为后缀的文件,是汇编语言源代码文件
.S为后缀的文件,是经过预编译的汇编语言源代码文件
Gcc编译器命令
在gdb提示符处键入help,将列出命令的分类,主要的分类有:
aliases:命令别名
breakpoints:断点定义
data:数据查看
files:指定并查看文件
internals:维护命令
running:程序执行
stack:调用栈查看
statu:状态查看
tracepoints:跟踪程序执行
键入help后跟命令的分类名,可获得该类命令的详细清单:
break NUM 在指定的行上设置断点
bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序
clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM
continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而导致停止运行时
display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成
file FILE 装载指定的可执行文件进行调试
help NAME 显示指定命令的帮助信息
info break 显示当前断点清单,包括到达断点处的次数等
info files 显示被调试文件的详细信息
info func 显示所有的函数名称
info local 显示当函数中的局部变量信息
info prog 显示被调试程序的执行状态
info var 显示所有的全局和静态变量名称
kill 终止正被调试的程序
list 显示源代码段
make 在不退出 gdb 的情况下运行 make 工具
next 在不单步执行进入其他函数的情况下,向前执行一行源代码
print EXPR 显示表达式 EXPR 的值
Gcc编译器处理器架构
Alpha
ARM
Atmel AVR
Blackfin
H8/300
IA-32〈x86〉 与x86-64
IA-64例如:Itanium
MorphoSys 家族
Motorola 68000
Motorola 88000
MIPS
PA-RISC
PDP-11
PowerPC
System/370,System/390
SuperH
HC12
SPARC
VAX
Renesas R8C/M16C/M32C家族
A29K
ARC
C4x
CRIS
D30V
DSP16xx
FR-30
FR-V
Intel i960
IP2000
M32R
68HC11
MCORE
MMIX
MN10200
MN10300
NS32K
ROMP
Stormy16
V850
Xtensa
D10V
MicroBlaze
PDP-10
MSP430
Z8000
更新日志
Gcc编译器 v10.0更新内容
1、带来了一组关于链接时优化 (LTO) 框架可提升伸缩性和降低内存使用
2、在64位系统上需要8G内存来对Firefox进行优化,然而用了LTO后只需3G
3、支持更多C++11标准,包括原子性、C++11 内存模型,用户定义文字、别名声明、构造器委派和可扩展的语法等
4、改进对 Fortran 的支持
5、支持Google Go 1等等多项改进
6、进一步加强了对已C++11的支持