下面是小编为大家整理的GCC安装手册.net,本文共8篇,如果喜欢可以分享给身边的朋友喔!

篇1:GCC安装手册.net
这是一份在 Unix 系统上安装GNU CC的程序,VMS系统的使用者请看*注解:VMS 安装,在这一节中,我们假设编译的动作是在和原始档案相同的目录下执行;如果希望在其他目录下执行编译动作,请看 *注解:其他目录。 在MS-DOS下直接安装 GNU CC 是不可行的,使用 DOS
这是一份在Unix系统上安装GNU CC的程序,VMS系统的使用者请看*注解:VMS 安装。在这一节中,我们假设编译的动作是在和原始档案相同的目录下执行;如果希望在其他目录下执行编译动作,请看 *注解:其他目录。在MS-DOS下直接安装 GNU CC 是不可行的,使用 DOS 下的任何编译器皆无法成功的编译 GNU CC,除非你使用 GNU CC 本身。欲在 MS-DOS 下安装 GNU CC,你必需取得已完全编译完成的套件:DJGPP。DJGPP 中含有机器码档案以及原始程式档,并且还包含了所有必需的编译工具及函式库。
1.如果你是在另外一部机器上,在同一目录下先完成了GNU CC的编译,执行 “make distclean” 来删除一些可能无用的档案。其中一个被删除的档案叫做 “Makefile”;如果 “make distclean” 回应 Makefile 不存在(not exist)的讯息,那可能表示这个目录已经被适当的清理完毕。
2.在 System V Release 4 系统上,请确定在路径 “PATH” 设定中,“/usr/bin” 在 “/usr/ucb” 之前。因为 “/usr/ucb” 中的 cc 使用了有错误的函式库。
3.你可以执行 “configure” 这支程式来设定 host machine、build machine、及 target machine。
所谓的 “build machine” 指的是你目前正在使用的机器;而“host machine” 则是你期望编译後所产生的编译器工作的机器;最後 “target machine” 则是你期望这个编译器(正在做编译的那个)产生的目的码的主机。(一般而言,前两者是相同的)。
如果你正在建立默认机器目的码的编译器(native compiler),一般而言,不需要在 “configure” 作任何的设定;它将以目前正在使用的机器作为 host、build 及target machine。所以当你制作 native compiler 的时候,不需作任何设定。除非 “configure” 无法指出你的系统组态或是它猜错了。
这样的情况下,用选项 --build 指定 build machine 的“configuration name”; host 及 target machine 将预设和 build machine相同。(若你正在建立的是一个交互编译器,请看 *注解:交互编译器)
底下是一个例子:
./configure --build=sparc-sun-sunos4.1
建置名 (configuration name) 可能是一个标准的形式或者是标准形式的缩写。
一个完整的建置名有由 “-” 号分开的三个部份。大概是:“CPU名称-厂商名称-系统名称”(每一个部份可含有自己的“-” 号,configure 这个程式会自行分辨之)。举例来说:“m68k-sun-sunos4.1” 是指 Sun 3。
你也可以用别名取代部份的建置名。例如:“sun3”就代表了 “m68k-sun”,“sun3-sunos4.1” 也是另一种Sun 3的表示方法。你也可以简单点用“sun3-sunos”,因为这边假设 SunOS 的版本预设为 4. “sun3-bsd” 也可以,因为 “configure”知道SunOS是Sun 3上唯一的 BSD 变种。
你可以在各种系统型态後面注明版本号码,及 CPU 型号。在大部份的例子当中,版本是没用的,而且会被忽略掉。所以如果你知道的话,最好也把号码加上去。(ranma 注:这段原文怪怪的)
关於所支援的建置名与建置的相关注解,请参考 *注解:建置。在继续安装GNU CC 之前,你最好看一下那份注解。
底下有四种附加的选项可以让你分别指定不同的硬体与软体建置:
“--with-gnu-as”, “with-gnu-ld”, “--with-stabs” 及 “--nfp”。
“--with-gnu-as”
如果你想要将 GNU CC 拿来跟 GNU 组译器 (GNU assembler) 并用的话,你可以在执行 configure时加上 “--with-gnu-as”这个选项。
使用这个选项并不会安装 GAS。它只是将GNU CC的输出修改成可以和GAS并用而已。要不要安装 GAS 由你自己决定,
相反地,如果你不要使用 GAS 而且在建构 GNU CC 时不注明“--with-gnu-as”的话,你也要自己决定是不是要安装 GAS。 GNU CC 会在各个目录□找“as”这个程式,如果它找到了 GAS 的话,它会用GAS。如果你不确定GNU CC到底是找到哪一个组译器来用的话,在执行 gcc 时加上 `-v' 这个选项。
会因为你是否使用 GAS 而产生不同变化的系统有:
“hppa1.0-ANY-ANY”, “hppa1.1-ANY-ANY”, “i386-ANY-sysv”,
“i386-ANY-isc”,
“i860-ANY-bsd”, “m68k-bull-sysv”, “m68k-hp-hpux”,
“m68k-sony-bsd”,
“m68k-altos-sysv”, “m68000-hp-hpux”, “m68000-att-sysv”,
“ANY-lynx-lynxos”, 及 “mips-ANY”). 对於其他系统,
“--with-gnu-as” 并不会造成影响。
上述系统中 (除了 HP-PA, 386 上的 ISC, 及 “mips-sgi-irix5.*”),如果你使用 GAS,你也应该要使用 GNU 连结器 (linker),也就是要注明 “--with-gnu-ld”。
“--with-gnu-ld”
如果你想要拿 GNU 连结器跟 GNU CC 并用的话,注明这个选项。
这个选项并不会安装 GNU 连结器,它只是改变 GNU CC 的习性来配合 GNU 连结器而已。比较不同的是,它使得 “collet2” 这个程式不会被安装。这个程式是在大部份的建构中拿来做系统连结器的前置处理用的。
“--with-stabs”
在大部份以MIPS 为基础的系统以及Alpha上,你必须指明要GNU CC产生出正规的ECOFF除错格式,或是要BSD式的stabs 传递 ECOFF 的符号表。正规的ECOFF除错格式并不能完整地处理C以外的语言。而BSD stabs格式可以处理其他语言,但只能在GNU除错器(GNU debugger)上面做。
在正常情况下,GNU CC预设使用 ECOFF 除错格式,如果你偏好BSD stabs格式,在编译时注明 “--with-stabs”。
不管你在建立 GNU CC 时是选用哪一种预设值,使用者都可以用“-gcoff” 和 “-gstabs+” 这两个选项来指定他所要用的除错格式。
“--with-stabs” 在 386 上的 ISC 系统中有特别意义,当 “--with-gas” 也被用到时。它会选择使用嵌在COFF 输出中的stabs除错资讯(stabs debugging information embedded in COFF output) 。这类的除错资讯也支援 C++,普通的COFF除错资讯并不能做到。
“--with-stabs” 在跑 SVR4 的 386 系统中也有特殊意义。它选择使用嵌在ELF输出中的stabs除错资讯。在 386 SVR4平台上,目前的C++ 编译器(2.6.0 版)并不支援 DWARF 除错资讯。stabs 提供了另一个可以用的方法。它需要 GAS 和 GDB,因为正常的SVR4工具并不能产生或解译 stabs 格式。
“--nfp”
在某些系统上,你必须藉由这个选项注明这台机器是否有浮点运算器。这些系统包括了 “m68k-sun-sunosN” 及 “m68k-isi-bsd”。目前“--nfp” 在其他系统上并没有作用,虽然在别的系统上可能也可以有不同的效果。
“configure” 这个程式会去原始码目录底下的子目录□面去找那些要跟GNU CC 整合的其他编译器。例如 GNU 的 C++编译器,G++,放在 “cp” 这个子目录□。“configure” 会把建立这些编译器的规则加到 “Makefile” 中。
底下我们会详细说明所有 “configure” 会设定的档案。在正常情况下,你不需要去担心这些档案。
* 会建立一个叫 “config.h” 的档案,□面有一个 “#include” 记载了你将来要用来执行这个编译器行的机器的顶层设定档 (*注解:建置)。这个档案用来定义 host machine 的资讯。其中包含 “tm.h”。
顶层设定档放在 “config” 这个子目录□。它都叫做 “xm-某某东西.h”,通常是 “xm-机器名.h”,但有些例外。
共2页: 1 [2] 下一页
原文转自:www.ltesting.net
篇2:GCC 手册Unix系统
it's useful! GCC Section: GNU Tools (1) Updated: /12/05 Index Return to Main Contents ------------------------------------------------------------------------ -------- NAME gcc,g++-GNU工程的C和C++编译器(egcs-1.1.2) 总览(SYNOPSIS) gcc[op
it's useful!GCC
Section: GNU Tools (1)
Updated: 2003/12/05
Index Return to Main Contents
------------------------------------------------------------------------
--------
NAME
gclearcase/“ target=”_blank“ >cc,g++-GNU工程的C和C++编译器(egcs-1.1.2)
总览(SYNOPSIS)
gcc[option|filename ]...
g++[option|filename ]...
警告(WARNING)
本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.
除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请
查对Info文件, Info文件是权威文档.
如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布
它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工
作没有留给我们时间做这个. GNU工程认为man手册是过时产物,应该把时间用到别的
地方.
如果需要完整和最新的文档,请查阅Info文件`gcc'或Using and Porting GNU CC (
for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc
texinfo.
描述(DESCRIPTION)
C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理
(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后
缀名标识源文件的 语言,但是对编译器来说,后缀名控制着缺省设定:
gcc
认为预处理后的文件(.i)是C文件,并且设定C形式的连接.
g++
认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.
源文件后缀名指出语言种类以及后期的操作:
c C源程序;预处理,编译,汇编
C C++源程序;预处理,编译,汇编
cc C++源程序;预处理,编译,汇编
cxx C++源程序;预处理,编译,汇编
m Objective-C源程序;预处理,编译,汇编
i 预处理后的C文件;编译,汇编
ii 预处理后的C++文件;编译,汇编
s 汇编语言源程序;汇编
S 汇编语言源程序;预处理,汇编
h 预处理器文件;通常不出现在命令行上
其他后缀名的文件被传递给连接器(linker).通常包括:
o 目标文件(Object file)
a 归档库文件(Archive file)
除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是 最后
的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(
包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.
选项(OPTIONS)
选项必须分立给出: `-dr'完全不同于`-d -r '.
大多数`-f'和`-W'选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno
-name).这里 只列举不是默认选项的格式.
下面是所有选项的摘要,按类型分组,解释放在后面的章节中.
总体选项(Overall Option)
-c -S -E -o file -pipe -v -x language
语言选项(Language Option)
-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-
equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -f
freestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields
-fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -f
writable-strings -traditional -traditional-cpp -trigraphs
警告选项(Warning Option)
-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return
-Wcast-align -Wcast-qual -Wchar-subscript. -Wcomment -Wconversion -Wenum-
clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplic
it-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpoi
nter-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes
-Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized
-Wunused -Wwrite-strings
调试选项(Debugging Option)
-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf
-gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=libr
ary -print-libgcc-file-name -print-prog-name=program
优化选项(Optimization Option)
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -fe
lide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -f
force-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemo
ize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-in
line -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedul
e-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-
loops -funroll-loops -O -O2 -O3
预处理器选项(Preprocessor Option)
-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include
file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostd
inc -P -Umacro -undef
汇编器选项(Assembler Option)
-Wa,option
连接器选项(Linker Option)
-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker opt
ion -Wl,option -u symbol
目录选项(Directory Option)
-Bprefix -Idir -I- -Ldir
目标机选项(Target Option)
-b machine -V version
配置相关选项(Configuration Dependent Option)
M680x0 选项
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -
mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float
VAX选项
-mg -mgnu -munix
SPARC选项
-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -mspar
clite -mv8 -msupersparc -mcypress
Convex选项
-margcount -mc1 -mc2 -mnoargcount
AMD29K选项
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmal
l -mstack-check -muser-registers
M88K选项
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-s
hift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -m
no-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mn
o-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area
-mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -
muse-div-instruction -mversion-03.00 -mwarn-passed-structs
RS6000选项
-mfp-in-toc -mno-fop-in-toc
RT选项
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mh
c-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return
MIPS选项
-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -
mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -m
no-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abi
calls -mhalf-pic -mno-half-pic -G num -nocpp
i386选项
-m486 -mno-486 -msoft-float -mno-fp-ret-in-387
HPPA选项
-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlo
ng-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon
i960选项
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedure
s -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-ali
gn -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compa
t -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-alig
n
DEC Alpha选项
-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float
System V选项
-G -Qy -Qn -YP,paths -Ym,dir
代码生成选项(Code Generation Option)
-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -f
nonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-retu
rn -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-d
ouble -fvolatile -fvolatile-global -fverbose-asm
总体选项(Overall Option)
-x language
明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).
这个选项应用于后面 所有的输入文件,直到遇着下一个`-x'选项. language的可选
值有`c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`
assembler-with-cpp'.
-x none
关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用
过`-x'选项).
如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x'选项(或文
件名后缀)告诉 gcc从哪里开始,用`-c', `-S',或`-E'选项告诉gcc到 哪里结束.注
意,某些选项组合(例如, `-x cpp-output -E')使gcc不作任何事情.
-c
编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.
缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i', `.s',等等,产生目标文
件名.可以使用-o选项选择其他名字.
GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).
-S
编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文
件.
缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i',等等,产生 目标文件名
可以使用-o选项选择其他名字.
GCC忽略任何不需要编译的输入文件.
-E
预处理后即停止,不进行编译.预处理后的代码送往标准输出.
GCC忽略任何不需要预处理的输入文件.
-o file
指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件
,汇编文件还是 预处理后的C代码.
由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o'选项没有意义,除非
输出一个可执行文件.
如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out', `source.suffi
x '的目标文件是`source.o',汇编文件是 `source.s',而预处理后的C源代码送往标
准输出.
-v
(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器
的版本号.
-pipe
在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无
法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题.
语言选项(LANGUAGE OPTIONS)
下列选项控制编译器能够接受的C ”方言“:
-ansi
支持符合ANSI标准的C程序.
这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字
,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启 不受欢迎和极少
使用的ANSI trigraph特性,以及禁止`$'成为标识符的一部分.
尽管使用了`-ansi'选项,下面这些可选的关键字, __asm__, __extension__, __in
line__和__typeof__仍然有效.你当然不会把 他们用在ANSI C程序中,但可以把他们
放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi'选项.另外一
些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi'选项,始终有效.
使用`-ansi'选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic'选项作为 `-
ansi'选项的补充.
使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件 关
注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用
;这样就不会干扰在其他地方 使用这些名字的程序了.
-fno-asm
不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, _
_inline__和__typeof__能够替代他们. `-ansi' 隐含声明了`-fno-asm'.
-fno-builtin
不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有
_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, s
qrt, strcmp, strcpy,和strlen.
`-ansi'选项能够阻止alloca和_exit成为内建函数.
-fhosted
按宿主环境编译;他隐含声明了`-fbuiltin'选项,而且警告不正确的main函数声明.
-ffreestanding
按独立环境编译;他隐含声明了`-fno-builtin'选项,而且对main函数没有特别要求
(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个in
t值,典型例子是除了 内核以外几乎所有的程序.对应的独立环境(freestanding en
vironment)不存在标准库,程序入口也不一定是 main,最明显的例子就是操作系统内
核.详情参考gcc网站最近的资料)
-fno-strict-prototype
对于没有参数的函数声明,例如`int foo ;',按C风格处理---即不说明参数个数或
类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.
-trigraphs
支持ANSI C trigraphs. `-ansi'选项隐含声明了`-trigraphs'.
-traditional
试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除
,这样当内容过时后,人们也不会 埋怨我们.
除了一件事:对于C++程序(不是C), `-traditional'选项带来一个附加效应,允许对
this赋值.他和`-fthis-is-variable'选项的效果一样.
-traditional-cpp
试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包
括 `-traditional'选项的其他效应.
-fdollars-in-identifiers
允许在标识符(identifier)中使用`$'字符(仅针对C++).你可以指定 `-fno-dollar
s-in-identifiers'选项显明禁止使用`$'符. (GNU C++在某些 目标系统缺省允许`
$'符,但不是所有系统.)
-fenum-int-equiv
允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C+
+允许从 enum到int的转换,反之则不行.
-fexternal-templates
为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个
模板函数 (template function),只在定义他们的地方生成一个副本.想要成功使用
这个选项,你必须在所有使用模板的 文件中,标记`#pragma implementation' (定义
)或`#pragma interface' (声明).
当程序用`-fexternal-templates'编译时,模板实例(template instantiation) 全
部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点
,他引用所需的每个 实例.相对应的,如果编译时使用缺省选项`-fno-external-tem
plates',所有模板实例明确的设为内置.
-fall-virtual
所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delet
e 成员操作符)视为所在类的虚函数.
这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出
可以直接调用某个虚函数;这时就 直接调用.
-fcond-mismatch
允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.
-fthis-is-variable
允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值
的 `this'显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作
然而为了 向后兼容,你可以通过`-fthis-is-variable'选项使这种操作有效.
-funsigned-char
把char定义为无符号类型,如同unsigned char.
各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char
理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或
unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或
者无符号数,具体情况取决于 编写程序的目标机器).这个选项,和它的反义选项,使
那样的程序工作在对应的默认值上.
char的类型始终应该明确定义为signed char或unsigned char,即使 它表现的和其
中之一完全一样.
-fsigned-char
把char定义为有符号类型,如同signed char.
这个选项等同于`-fno-unsigned-char',他是the negative form. of `-funsigned-
char'的相反选项.同样, `-fno-signed-char'等价于 `-funsigned-char'.
-fsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
-fno-unsigned-bitfields
如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域 (b
itfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型
,如int,是 有符号数.
然而,如果指定了`-traditional'选项,位域永远是无符号数.
-fwritable-strings
把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们
假设字符串常量是可写的. `-traditional'选项也有相同效果.
篡改字符串常量是一个非常糟糕的想法; ``常量''就应该是常量.
预处理器选项(Preprocessor Option)
下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.
如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`-E'选项一起
才 有意义,因为他们的输出结果不能用于编译.
-include file
在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译
命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令
行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理.
-imacros file
在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件f
ile的 输出内容, `-imacros file'选项的唯一效果就是使文件file中的宏定义生效
, 可以用于其他输入文件.在处理`-imacrosfile'选项之前,预处理器首先处理`-D'
和`-U'选项,并不在乎他们在命令行上的顺序.然而`-include'和 `-imacros'选项
按书写顺序处理.
-idirafter dir
把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I'添加的路径
)中没有 找到,预处理器就搜索第二包含路径.
-iprefix prefix
指定prefix作为后续`-iwithprefix'选项的前缀.
-iwithprefix dir
把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前
的`-iprefix'选项指定.
-nostdinc
不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果
合适).
结合使用`-nostdinc'和`-I-'选项,你可以把包含文件搜索限制在显式指定的目录.
-nostdinc++
不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg
++'时使用 这个选项.)
-undef
不要预定义任何非标准宏. (包括系统结构标志).
-E
仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件
-C
告诉预处理器不要丢弃注释.配合`-E'选项使用.
-P
告诉预处理器不要产生`#line'命令.配合`-E'选项使用.
-M [ -MG ]
告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个
源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标
文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可
以是单行,但如果太长,就用`\'-换行符续成多行.规则 显示在标准输出,不产生预处
理过的C程序.
`-M'隐含了`-E'选项.
`-MG'要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必
须和 `-M'选项一起用.
-MM [ -MG ]
和`-M'选项类似,但是输出结果仅涉及用户头文件,象这样`#include file”'.忽略系
统头文件如`#include
-MD
和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.
o'替换为 `.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常的编
译任务.
Mach的实用工具`md'能够合并`.d'文件,产生适用于`make'命令的单一的 依赖文件
-MMD
和`-MD'选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.
-H
除了其他普通的操作, GCC显示引用过的头文件名.
-Aquestion(answer)
如果预处理器做条件测试,如`#if #question(answer)',该选项可以断言(Assert)
question的答案是answer. -A-'关闭一般用于描述目标机的标准断言.
-Dmacro
定义宏macro,宏的内容定义为字符串`1'.
-Dmacro=defn
定义宏macro的内容为defn.命令行上所有的`-D'选项在 `-U'选项之前处理.
-Umacro
取消宏macro. `-U'选项在所有的`-D'选项之后处理,但是优先于任何 `-include'或
`-imacros'选项.
-dM
告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结
合`-E'选项使用.
-dD
告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.
-dN
和`-dD'选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.
汇编器选项(ASSEMBLER OPTION)
-Wa,option
把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.
原文转自:www.ltesting.net
篇3:GCC 4.0的新特性.net
GCC(GNU Compiler Collection) 是 GNU(GNU's Not Unix ) 计划提供的编译器家族,它能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程序设计语言前端,同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha 等等几乎目前所有的硬件平台上,
GCC(GNU Compiler Collection) 是 GNU(GNU's NotUnix) 计划提供的编译器家族,它能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程序设计语言前端,同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha 等等几乎目前所有的硬件平台上。鉴于这些特征,以及 GCC 编译代码的高效性,使得 GCC 成为绝大多数自由软件开发编译的首选工具。虽然对于程序员们来说,编译器只是一个工具,除了开发和维护人员,很少有人关注编译器的发展,但是 GCC 的影响力是如此之大,它的性能提升甚至有望改善所有的自由软件的运行效率,同时它的内部结构的变化也体现出现代编译器发展的新特征,所以 4月20日,GNU 组织发布的 GCC 4.0 引起了广泛的关注。那么这次 GCC 从 3.4.x 直接跃迁到 4.x 的主版本变化到底有什么值得关注的呢?
我们可以从不同的角度看待 GCC 的这次变迁,对于普通程序员来说,关注的主要是GCC 的前端支持情况以及编译性能的变化。
1. GCC 4.0 的前端支持
GCC 的开发者和使用者当中,大多数人都是 C 或者 C++ 的用户,所以 GCC 对Fortran 语言支持不足也不令人奇怪。但是,这并不代表 Fortran 是无足轻重的,事实上,开发商业的 Fortran 编译器的公司要远远多于开发 C 和 C++ 编译器的公司。
在科学计算和工程应用领域,程序员们仍然在频繁使用 Fortran 程序,同时,大量的经过长时间考验的函数库也为Fortran语言的数值计算提供了强有力的支持,所以,在一些“超级计算机” (supercomputer)上,Fortran仍然是绝大多数应用的首选语言。
然而,在GCC 4.0发布之前,如果不想购买商用的Fortran编译器,那么程序员们的唯一选择就是GNU的g77编译器。但是g77编译器是一个相当陈旧的技术,很多Fortran语言的新特性都不能支持,比如流行的Fortran 95,它能够支持的模块化编程,并行处理和数组操作等等,g77编译器基本上都无法支持。
这次GCC 4.0发布时推出了支持Fortran 95语言前端的编译器gfortran,它已经能够大大超越g77编译器,支持Fortran 95标准中的很多新特性,虽然gfortran还有一些缺陷,比如不能支持自动并行化(automatic parallelization),不能支持Fortran 2003中的面向对象特性等等,它已经给了Fortran程序员除了商业编译器和g77以外一个更好的选择。
2. GCC 4.0的编译性能
编译器的性能主要可以从三个方面来考查:
1. 编译时间(compile time),指编译器编译一个源程序得到目标代码所需要的时间。
2. 目标代码的大小(object size),编译得到的目标代码当然是越精悍越好了。
3. 目标代码运行时间(run time),运行时间体现了速度和效率。
这里,作者没有亲自测试和实验,引用了 Scott Robert Ladd的《GCC 4.0: A Review for AMD and Intel Processors》文章中的一些实验结果。这篇文章引起了比较大的反响,其实验结果和结论也得到了广泛的认可,如果对Scott的具体测试采用的软硬件平台和工具方法感兴趣,原文可以在www.coyotegulch.com/reviews/gcc4/看到。
Scott 使用AMD和Intel的两款处理器:64位的Opteron处理器和32位的Pentium 4处理器,分别针对GCC 3.4.3和GCC 4.0来进行测试。他选用了POV-Ray 3.6.1, LAME 3.96.1, SciMark 2.0和Linux 2.6.11.8作为benchmark来进行测试,分别记录了GCC 3.4.3和GCC 4.0在ADM Opteron和Intel Pentium 4下的编译时间、代码大小和代码运行时间进行比较,具体的实验结果请参见原文。
这样,根据这些实验数据,我们可以给出一个粗糙的结论,在编译性能方面,GCC 4.0似乎不如GCC 3.4.3,因为在很多时候,GCC 4.0的编译时间、代码大小以及代码运行时间全面高于GCC 3.4.3。这样的结果看似出人意料,GCC这次大的版本变化就是因为引入了新的优化框架,怎么会编译性能有所下降呢?这主要是因为:首先,这是一次主版本变化,我们可以理解巨大的变化带来的性能损耗;另外,更主要的是,GCC新的优化框架的潜力尚未完全发挥出来,这一点,在我们文章结束的时候,读者会有更深的理解。
3. GCC 4.0 的内部结构变化
GCC 遵循 GPL 协议,是开放源代码的,其开发过程也是完全开放的,任何人都可以对 GCC 的发展作出贡献,因而 GCC 特别适合用于学习和研究编译器。对于学习和研究编译器本身来说,GCC 内部的结构变化显然更吸引人。
目前 GCC 发行维护者 Mark Mitchell 在接受 inte.netnews.com 网站采访时这样说到:“毫无疑问地,GCC 4.0 中最引人注意的特性以及为何把 GCC 的这个版本称作 4.0 而不是 3.5,就是因为其新的优化框架(optimization infrastructure)。大体上来说,GCC 以前的版本的代码优化工作主要在底层机器指令级别进行的。不幸的是,到了底层的时候,很多信息已经丢失了,因此,GCC 4.0 在更接近输入高级语言程序的级别上做了很多优化工作。”
Mark Mitchell 所说的 GCC 新的优化框架主要就是指 Tree SSA(Static Single Assignment),Tree SSA 经过长时间的独立开发,最终整合进了 GCC 的主流(mainstream)中,可见这种设计是意义非凡的。Tree SSA 是什么?为什么要采用 Tree SSA? 使用了 Tree SSA 的 GCC 有什么不同?新的 GCC 编译和优化框架是什么样的?等等,这些将是本文探讨的主要问题。
这部分文章内容是这样组织的:首先回顾 GCC 4.0 版本之前的编译流程,以便进行对比;接下来介绍 GCC 4.0 的编译流程以及新的优化框架结构,这里先介绍 GENERIC Tree和 GIMPLE Tree,SSA 形式等基本概念,在读者对这些概念和理论有了一定的了解之后,再介绍 GCC 中是如何实现 Tree SSA 框架结构的。
3.1 GCC 4.0 之前的编译流程
这里有必要回顾一下 GCC4.0 之前的版本进行代码优化的框架结构,以便进行对比分析。GCC 的前端在接受了输入的源程序之后,经过分析器(parser)处理得到 Parse Tree(通常是一种抽象语法数,AST, Abstract Syntax Tree),根据这个 Parse Tree 生成程序的RTL(Register Transfer Language)表示,然后在 RTL 表示的基础上进行优化处理,然后生成相应的目标代码,如下图 1 所示。
但是 RTL 表示是一个相当接近底层的表示,也就是说它更接近目标代码,适合进行目标相关的优化工作,比如寄存器分配等等。然而,很多的优化转换工作需要更高层的程序信息,比如数组引用、数据类型、控制流结构等等,这些很难用 RTL 表示,或者无法用 RTL表示。
图1. GCC 4.0之前版本的代码编译流程和优化框架
javascript.:if(this.width>498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=219 alt=“图1. GCC 4.0之前版本的代码编译流程和优化框架” src=“/files/uploadimg/0919/1428230.jpg” width=521 border=0 xmlns:xsi=“www.w3.org//XMLSchema-instance”>
3.2 GCC 4.0 的优化框架(Optimization Infrastructure)
提供一个可移植性强、跨平台以及编译高效代码的编译器,是 GCC 一贯追求的目标,为了使 GCC 能够获得更好的编译性能,高层程序信息级别的优化工作是必须的。Tree SSA设计的主要目的就在于此,它既与前端语言无关,又与后端目标无关,而且能够提供在 RTL表示层很难或者无法进行的高级分析和转换。
Tree SSA 起先是作为 GCC 的一个分支(branch)进行独立开发的,经过两年多的努力开发,终于在 年 5 月 13 日进入了 GCC 的主流版本。在 GCC 的 SSA for Trees 分支的网页上明确说明了,这个项目的目的就是构建一个对基于 SSA 形式的树的优化框架。在学习编译原理的时候我们知道,编译器通常会使用树的形式来描述程序,GCC 也是这样,在接受了输入的源程序后,GCC 驱动其相应语言的前端分析器(parser),处理得到一个 Tree。从图 1 可以看到,4.0 版本之前的 GCC 几乎是立即把这些 Tree 转换成了 RTL 表示。那么现在 GCC4.0 的 Tree SSA 优化框架就是在前端生成 Parse Tree 之后,把这些 Tree 转换成基于 SSA 的 Tree,对这些 SSA 形式的 Tree 进行高层次的优化,然后才把 Tree 转换成 RTL 表示。
3.2.1 GENERIC Tree 和 GIMPLE Tree
这个框架结构看起来比较简单,而且 GCC 的 Parse Tree 能够提供足够的信息来实现SSA,但是在真是实施的时候,还是有很大的困难的,最主要的两个困难是这样的:
1. GCC 中的树没有统一的表示形式,每一个前端都定义了自己的树。这就意味着要得到基于 SSA 形式的树必须要对每种前端分析生成的树都进行处理。
2. GCC 前端得到的 Parse Tree 的复杂度是无法估量的。把这些树转换成基于 SSA形式的树需要进行复杂的处理工作。
为了解决以上两个问题,GCC Tree SSA 分支的开发小组引入了 GENERIC Tree 和GIMPLE Tree 两个概念:
1. GENERIC Tree 是特意创造出来的 GCC 通用的树的表示形式,它能够表示不同的前端所需要的所有的结构,而且又能够去除语言相关性。
2. GIMPLE Tree是取自GENERIC Tree和SIMPLE两个短语的。因为GENERIC Tree的复杂性导致实现SSA形式的困难,需要把GENERIC Tree进行简化,这种简化的GENERIC Tree就称之为GIMPLE Tree。
好了,了解了这些内容之后,我们可以看看 GCC 4.0 的编译流程和优化框架,如下图2所示:
图2. GCC 4.0 的编译流程和优化框架
498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=152 alt=“图2. GCC 4.0 的编译流程和优化框架” src=“/files/uploadimg/20050919/1428231.gif” width=539 border=0 xmlns:xsi=“www.w3.org/2001/XMLSchema-instance”>
3.2.2 Single Static Assignment Form. 的基础介绍
到现在为止,我们基本搞清了新的 GCC 的编译过程,也大概了解了所谓的新的 Tree SSA 优化框架,
上面提到的 GENERIC Tree 和 GIMPLE Tree 都是为了实现 SSA 而做的准备工作,那么 SSA 本身究竟是什么?为什么 GCC 要把 Parse Tree 转换成基于 SSA 形式的 Tree 再做优化工作呢?为弄清楚这些问题,我们有必要多花一些篇幅对SSA的基本概念和理论做一些介绍。
SSA 的全称是 Static Single Assignment,直译过来就是静态单一赋值,它是IBM公司在上个世纪 80 年代研究的成果。从前面的讨论可以看出,Tree SSA 与 RTL 一样,也是一种中间表示形式,不过相比 RTL 要更高层一点。SSA 形式是一种相对而言比较新颖的中间表示形式,早期的讲编译原理或者编译器的课本中大多没有提及。
简单的说,SSA 形式就是每个变量只能被赋值一次。这样,非 SSA 形式的程序在转换成 SSA 形式的时候,其中的部分变量就会被分割成很多版本,通常使用下标来表示这些不同的版本。下面举一个简单的例子来说明,如下图 3 所示:
图3. 程序的非 SSA 形式和 SSA 形式
498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=132 alt=“图3. 程序的非 SSA 形式和 SSA 形式” src=“/files/uploadimg/20050919/1428232.gif” width=407 border=0 xmlns:xsi=“www.w3.org/2001/XMLSchema-instance”>
上图中所示的代码片段,由于 y 变量被赋值两次,所以在转化成 SSA 形式的时候,y变量被分割成两个版本 y1 和 y2,这样就保证了每个变量仅仅被赋值一次。
由于 SSA 形式中每个变量只能被赋值一次,那么 SSA 形式就能有效地把程序中所操作的数值和这些数值的存储位置这两者分开,这样就能方便一些优化工作。比如我们刚才看的图 3 中的代码片段,我们可以通过肉眼分析发现在非 SSA 形式中的第一条语句y := 1是一条无效的冗余语句,真正决定 y 变量值的是第二条 y := 2 赋值语句。那么在代码优化的时候,第一条语句就应该被删除掉。但是这是我们人工发现的优化结果,如果想要编译器来完成这个优化工作,需要进行复杂的分析,在编译原理中称之为“定义可达性分析”(reaching definition analysis)。而在 SSA 形式中,显然,做出这样的优化决定则无需进行太多分析。
这只是 SSA 形式诸多优点中的一个而已,使用 SSA 形式可以利用更多的编译器优化算法或者是提高这些算法的效率,比如 constant propagation, sparse conditional constant propagation, dead code elimination, global value numbering, partial redundancy elimination 以及register allocation 等等。这里涉及太多编译理论和算法,本文不作详细讨论。
SSA 形式具有上文所述的优点,当然也会有其复杂和困难的地方了,下面我们通过一个稍微复杂点的程序片段来说明把非 SSA 形式的程序转换成 SSA 形式程序的时候有些什么需要考虑的问题:
498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=272 alt=“” src=“/files/uploadimg/20050919/1428233.gif” width=543 border=0 xmlns:xsi=“www.w3.org/2001/XMLSchema-instance”>
图 4-a 所示的非 SSA 形式的程序在转换成了图 4-b 所示的 SSA 形式的程序后,有一个问题很难解决,就是图 4-b 中最下面程序块中 y 的值无法确定。因为在此之前有一条选择语句,导致程序控制流产生了分支,此时 y 的值可能是 y1 也可能是 y2,这是由程序具体执行时经过哪一条控制流来决定的。处理的方法是在最后一块程序片段之前加上一个 Φ 函数,定义一个新的 y3,并从 y1 或者 y2 中选择一个适当的值赋给 y3,如图 4-c 所示。
推而广之,在将非 SSA 形式的程序转换成 SSA 形式后,如果某个变量被分割成了 n个不同版本的变量后,在某一点需要会合,那么在这个会合点 (joint point) 就需要加入一个 Φ 函数来确定应该选择这 n 个不同版本的变量中的某一个值。这样问题就转变成了如何计算这个 Φ 函数以及确定在程序中的什么位置应该插入 Φ 函数,这个可以使用 dominance frontiers 来进行计算,关于如何高效计算这个 Φ 函数的算法研究本文不作深入讨论。
3.2.3 GCC 4.0 中的 Tree SSA 框架的设计和实现
至此,我们已经比较清楚的了解了什么是 SSA,SSA 形式有什么好处,如何将非 SSA表示转换成基于SSA形式的表示以及这个过程中需要解决的主要问题等等,本文将不再对SSA进行深入的讨论了,回到我们的主题,继续讨论GCC 4.0 的 Tree SSA 优化框架是如何设计和实现的,它是怎样把 Tree SSA 融入到 GCC 的编译过程中去的。
回顾上图 2表示的 GCC 4.0 编译流程,在得到 GIMPLE Tree 之后,经过 GIMPLE optimizer 和 GIMPLE expander 的处理,得到了程序的 RTL 表示。其实把程序转换成 SSA形式和在此基础上进行优化就在这个过程中完成的,下面我们就来具体看看 GCC 4.0 是怎么做的。在 GIMPLE 和 RTL 之间是树优化 (Tree Optimization) 的过程,如下图 5 所示。图 5 中所示的树优化器 (Tree Optimizer) 主要完成这几个功能:
1. 生成一个控制流转换图 CFG(Control Flow Graph)。
2. 将 GIMPLE Tree 转换成基于 SSA 形式的 Tree。
3. 进行 Tree SSA 的优化。
4. 将优化后的基于 SSA 形式的 Tree 转换成 RTL 接口所能识别的非 SSA Tree 的形式。
图5. GCC 4.0 的 Tree Optimizer 结构
498)this.style.width=498;' nmousewheel = 'javascript.:return big(this)' height=211 alt=“图5. GCC 4.0 的 Tree Optimizer 结构” src=“/files/uploadimg/20050919/1428234.jpg” width=512 border=0 xmlns:xsi=“www.w3.org/2001/XMLSchema-instance”>
结合 GCC 4.0 代码中的部分源文件来说明:图 5 中这个 Tree Optimizer 的行为是由tree-optimize.c 文件驱动的,tree-ssa.c, tree-into-ssa.c 以及 tree-outof-ssa.c 负责完成 SSA 形式的转换、验证以及其他需要与 SSA 形式交互的功能,建立和管理控制流转换图 CFG 的工作由 tree-cfg.c 完成。不同的树分析和优化功能分别在相应的源文件中独立实现,这些分析和优化函数必须向 GCC 注册,然后才能由 tree-optimize.c 进行驱动和管理,结合图 5来看,SSA pass1, SSA pass2 … SSA passn 代表了实现各种不同功能的 SSA 分析器,他们向 Tree Optimizer 注册,在编译时刻 Tree Optimizer 根据编译选项等等选择相应的SSA分析器进行优化或者其他处理工作,并保证在基于 SSA 形式的处理完成之后将 SSA 树转换成非 SSA树,交给下面的 RTL 模块处理。
至此,GCC 4.0 的 Tree SSA 优化框架结构应该比较清楚了。读者可能会注意到,文中多次提到Tree SSA是一个优化框架结构(Optimization Infrastructure),为什么说是一个Infrastructure 呢?其实把 Infrastructure 称作框架结构或许并不贴切,更精确地说 Tree SSA是 GCC 提供的一种进行优化工作的基础设施。图 5 中已经体现出了这一点,Tree SSA 的分析和优化工作不是一成不变的,具体选择哪些优化功能和算法是由Tree Optimizer选择驱动的,而且这个Infrastructure是相当灵活的,我们可以很方便的加入一个 SSA 分析器,只需要如下步骤:
1. 创建一个 struct tree_opt_pass 类型的全局变量。
2. 在 tree-pass.h 头文件中为这个新的分析器添加一个外部声明(extern declaration)。
3. 调用 NEXT_PASS 把这个新的分析器加入到 tree-optimize.c: init_tree_optimization_passes 序列中。
所以这种 Infrastructure 是一个相当灵活和方便的设计,使得我们可以便利地加入新的SSA 分析器,或者使用更高效的算法来重新设计完成一些优化功能等等。
4. 总结
GCC 4.0 发布以来得到了引起了广泛的关注,新的 gfortran 前端给 Fortran 程序员带来了福音,但也有很多不尽如人意的地方,比如编译性能的损耗,以及向后兼容问题。比如KDE(K Desktop Environment) 开发小组在发现 GCC 4.0 无法正常编译 KDE 后,迅速的抛弃了 GCC 4.0。而且,出于稳定性的考虑,GCC 3.x 版本的开发仍然在进行中。这些似乎给 GCC 4.0 的前景笼罩上了一层阴影,但我们应该容忍一点,给 GCC 4.0 一些信心,向后兼容的问题应该是能够解决的。
至于编译性能的问题,通过我们这篇文章的讨论,我们可以看到 GCC 4.0 Tree SSA 的优化框架结构并没有充分发挥出其潜能,还可以增加和改进更多 Tree SSA 的优化工作,假以时日,GCC 4.0 的编译性能会得到提高的。
总的来说,这次 GCC 从 3.x 版本跃迁到 4.x 版本更像一个进化 (evolution) 的过程,而非一个革命性 (revolution) 的过程,它采用的 Tree SSA 优化框架代表了编译器发展的方向,我们应该关注 GCC 4.0 的进一步发展。
原文转自:www.ltesting.net
篇4:GCC 手册(再续)Unix系统
续 -print-libgcc-file-name 和`-print-file-name=libgcc.a'一样. -print-prog-name=program 类似于`-print-file-name',但是查找程序program如`cpp'. 优化选项(OPTI MI ZATION OPTION) 这些选项控制多种优化措施: -O -O1 优化.对于大函数,优化编译占用稍微多
续-print-libgclearcase/“ target=”_blank“ >cc-file-name
和`-print-file-name=libgcc.a'一样.
-print-prog-name=program
类似于`-print-file-name',但是查找程序program如`cpp'.
优化选项(OPTIMIZATION OPTION)
这些选项控制多种优化措施:
-O
-O1
优化.对于大函数,优化编译占用稍微多的时间和相当大的内存.
不使用`-O'选项时,编译器的目标是减少编译的开销,使编译结果能够调试.语句是独
立的:如果在 两条语句之间用断点中止程序,你可以对任何变量重新赋值,或者在函
数体内把程序计数器指到其他语句,以及从源程序中 精确地获取你期待的结果.
不使用`-O'选项时,只有声明了register的变量才分配使用寄存器.编译结果比不用
`-O'选项的PCC要略逊一筹.
使用了`-O'选项,编译器会试图减少目标码的大小和执行时间.
如果指定了`-O'选项, `-fthread-jumps'和`-fdefer-pop'选项将被 打开.在有del
ay slot的机器上, `-fdelayed-branch'选项将被打开.在即使没有帧指针 (frame
pointer)也支持调试的机器上, `-fomit-frame-pointer'选项将被打开.某些机器上
还可能会打开其他选项.
-O2
多优化一些.除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作.例如不
进行循环展开(loop unrolling)和函数内嵌(inlining).和-O选项比较,这个选项既
增加了编译时间,也提高了生成代码的 运行效果.
-O3
优化的更多.除了打开-O2所做的一切,它还打开了-finline-functions选项.
-O0
不优化.
如果指定了多个-O选项,不管带不带数字,最后一个选项才是生效的选项.
诸如`-fflag'此类的选项描述一些机器无关的开关.大多数开关具有肯定和否定两种
格式; `-ffoo'开关选项的否定格式应该是`-fno-foo'.下面的列表只展示了一种格
式---那个不是 默认选项的格式.你可以通过去掉或添加`no-'构造出另一种格式.
-ffloat-store
不要在寄存器中存放浮点变量.这样可以防止某些机器上不希望的过高精度,如6800
0的浮点寄存器(来自 68881)保存的精度超过了double应该具有的精度.
对于大多数程序,过高精度只有好处.但是有些程序严格依赖于IEEE浮点数的定义.对
这样的程序可以使用 `-ffloat-store'选项.
-fmemoize-lookups
-fsave-memoized
使用探索法(heuristic)进行更快的编译(仅对C++).默认情况下不使用探索法.由于
探索法只对某些输入文件 有效,其他程序的编译速度会变得更慢.
第一次编译器必须对成员函数(或对成员数据的引用)建立一个调用.它必须(1)判断
出这个类是否实现了那个名字的 成员函数; (2)决定调用哪个成员函数(涉及到推测
需要做哪种类型转换); (3)检查成员函数对调用者是否可见.所有这些构成 更慢的
编译.一般情形,第二次对成员函数(或对成员数据的引用)建立的调用,必须再次经过
相同长度的处理.这意味着象 这样的代码
cout << ”This “ << p << ” has “ << n << ” legs.\n“;
对整个三步骤要做六次遍历.通过使用软件缓存, ``命中''能够显著地减少这种代价
然而不幸的是,使用这种缓存 必须实现其他机制,带来了它自己的开销. `-fmemoi
ze-lookups'选项打开软件缓存.
因为函数的正文环境不同,函数对成员和成员函数的访问权(可见性)也可能不同, g
++可能需要刷新缓存. 使用`-fmemoize-lookups'选项,每编译完一个函数就刷新缓
存.而`-fsave-memoized'选项 也启用同样的缓存,但是当编译器发觉最后编译的函
数的正文环境产生的访问权和下一个待编译的函数相同,编译器就 保留缓存内容.这
对某个类定义许多成员函数时非常有用:除了某些其他类的友函数,每个成员函数拥
有和其他成员函数完全一样 的访问权,因而无需刷新缓存.
-fno-default-inline
默认为不要把成员函数内嵌,因为它们定义在类的作用域内(仅C++).
-fno-defer-pop
一旦函数返回,参数就立即弹出.对于那些调用函数后必须弹出参数的机器,编译器一
般情况下让几次函数调用的参数 堆积在栈上,然后一次全部弹出.
-fforce-mem
做数学运算前把将要使用的内存操作数送入寄存器.通过把内存访问转换成潜在的公
共子表达式,它可能产生较好的目标码. 如果它们不是公共子表达式,指令组合应该
消除各自的寄存器载荷.我乐意倾听不同意见.
-fforce-addr
做数学运算前把将要使用的内存地址常数送入寄存器.它可能和`-fforce-mem'一样
产生较好的 目标码.我乐意倾听不同意见.
-fomit-frame-pointer
对于不需要帧指针(frame. pointer)的函数,不要在寄存器中保存帧指针.这样能够避
免保存,设置和恢复 帧指针的指令;同时对许多函数提供一个额外的寄存器. 但是在
大多数机器上将无法调试.
某些机器上,如Vax,这个选项无效,因为标准调用序列自动处理帧指针,通过假装不存
在而不保存任何东西.机器描述宏 FRAME_POINTER_REQUIRED控制目标机是否支持这
个选项.
-finline-functions
把所有简单的函数集成进调用者.编译器探索式地决定哪些函数足够简单,值得这种
集成.
如果集成了所有给定函数的调用,而且函数声明为static,那么一般说来GCC有权不按
汇编代码输出函数.
-fcaller-saves
允许在寄存器里分配数值,但是这个方案通常受到各个函数调用的冲击,因此GCC生成
额外的代码,在函数调用的 前后保存和复原寄存器内容.仅当生成代码看上去优于反
之结果时才实现这样的分配.
某些机器上该选项默认为允许,通常这些机器没有调用保护寄存器代替使用.
-fkeep-inline-functions
即使集成了某个函数的所有调用,而且该函数声明为static,仍然输出这个函数一个
独立的,运行时可调用 的版本.
-fno-function-cse
不要把函数地址存入寄存器;让调用固定函数的指令显式给出函数地址.
这个选项产生效率较低的目标码,但是如果不用这个选项,某些不寻常的hack,改变汇
编器的输出,可能因优化而带来 困惑.
-fno-peephole
禁止任何机器相关的peephole优化.
-ffast-math
这个选项出于速度优化,允许GCC违反某些ANSI或IEEE规则/规格.例如,它允许编译器
假设sqrt 函数的参数是非负数.
这个选项不被任何`-O'选项打开,因为对于严格依靠IEEE或ANSI规则/规格实现的数
学函数,程序可能 会产生错误的结果.
下列选项控制特定的优化. `-O2'选项打开下面的大多数优化项,除了`-funroll-lo
ops'和 `-funroll-all-loops'项.
而`-O'选项通常打开`-fthread-jumps'和`-fdelayed-branch' 优化项,但是特定的
机器上的默认优化项有可能改变.
如果特别情况下非常需要``微调''优化,你可以使用下面的选项.
-fstrength-reduce
执行循环强度缩小(loop strength reduction)优化,并且消除重复变量.
-fthread-jumps
执行优化的地点是,如果某个跳转分支的目的地存在另一个条件比较,而且该条件比
较包含在前一个比较语句之内,那么 执行优化.根据条件是true或者false,前面那条
分支重定向到第二条分支的目的地或者紧跟在第二条分支后面.
-funroll-loops
执行循环展开(loop unrolling)优化.仅对循环次数能够在编译时或运行时确定的循
环实行.
-funroll-all-loops
执行循环展开(loop unrolling)优化.对所有循环实行.通常使程序运行的更慢.
-fcse-follow-jumps
在公共子表达式消元(common subexpression elimination)的时候,如果没有其他路
径到达某个跳转的 目的地,就扫过这条jump指令.例如,如果CSE遇到带有else从句的
if语句,当条件测试为 false时, CSE就跟在jump后面.
-fcse-skip-blocks
它类似于`-fcse-follow-jumps'选项,但是CSE跟在条件跳转后面,条件跳转跳过了
语句块(block).如果CSE遇到一条简单的if语句,不带else从句, `-fcse-skip-bloc
ks'选项将导致CSE跟在if产生的跳转后面.
-frerun-cse-after-loop
执行循环优化后,重新进行公共子表达式消元.
-felide-constructors
如果看上去合理就省略构造子(仅C++).根据这个选项,对于下面的代码, GNU C++直
接从调用foo 初始化y,而无需通过临时变量:
A foo ; A y = foo ();
如果没有这个选项, GNU C++首先通过调用类型A 合适的构造子初始化y;然后把 fo
o的结果赋给临时变量;最后,用临时变量替换`y'的初始值.
ANSI C++标准草案规定了默认行为(`-fno-elide-constructors').如果程序的构造
子存在 副效应, `-felide-constructors'选项能够使程序有不同的表现,因为可能
忽略一些构造子的调用.
-fexpensive-optimizations
执行一些相对开销较大的次要优化.
-fdelayed-branch
如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed bra
nch)指令后面的指令空隙.
-fschedule-insns
如果对目标机支持这个功能,它试图重新排列指令,以便消除因数据未绪造成的执行
停顿.这可以帮助浮点运算或内存访问 较慢的机器调取指令,允许其他指令先执行,
直到调取指令或浮点运算完成.
-fschedule-insns2
类似于`-fschedule-insns'选项,但是在寄存器分配完成后,需要一个额外的指令调
度过程.对于 寄存器数目相对较少,而且取内存指令大于一个周期的机器,这个选项
特别有用.
目标机选项(TARGET OPTION)
缺省情况下, GNU CC编译出本机类型的目标码.然而也可以把他安装成交叉编译器,
为其他机型编译程序.事实上,针对不同的目标机,可以同时安装GNU CC相应的配置
然后用`-b'选项指定 目标机种.
顺便提一下,新版本和旧版本的GNU CC可以共存.其中一个版本(可能是最新的那个)
为缺省版本,但是有时候你希望使用 其他版本.
-b machine
参数machine指出编译的目标机种.这个选项用于安装为交叉编译器的GNU CC.
参数machine的值和配置GNU CC交叉编译器时设置的机器类型一样.例如,如果交叉编
译器配置有 `configure i386v',意思是编译80386上的System V目标码,那么你可以
通过`-b i386v'运行交叉编译器.
如果没有指定`-b'选项,通常指编译本机目标码.
-V version
参数version指出运行哪个版本的GNU CC.这个选项用于安装了多个版本的GCC.例如
,如果 version是`2.0',意味着运行GNU CC 2.0版.
如果没有指定`-V'选项,缺省版本取决于GNU CC的安装方式,一般说来推荐使用通用
版本.
机器相关选项(MACHINE DEPENDENT OPTION)
每一种目标机型都有自己的特别选项,这些选项用`-m '开关引导,选择不同的硬件型
号或配置---例如, 68010还是68020,有没有浮点协处理器.通过指定选项,安装 编译
器的一个版本能够为所有的型号或配置进行编译.
此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台
的其他编译器.
下面是针对68000系列定义的`-m'选项:
-m68000
-mc68000
输出68000的目标码.如果编译器按基于68000的系统配置,这个选项就是缺省选项.
-m68020
-mc68020
输出68020的目标码(而不是68000).如果编译器按基于68020的系统配置,这个选项就
是缺省选项.
-m68881
输出包含68881浮点指令的目标码.对于大多数基于68020的系统这是缺省选项,除非
设置编译器时指定了 -nfp .
-m68030
输出68030的目标码.如果编译器按基于68030的系统配置,这个选项就是缺省选项.
-m68040
输出68040的目标码.如果编译器按基于68040的系统配置,这个选项就是缺省选项.
-m68020-40
输出68040的目标码,但是不使用新指令.生成的代码可以在68020/68881上,也可以在
68030或 68040上较有效地运行.
-mfpa
输出包含SUN FPA浮点指令的目标码.
-msoft-float
输出包含浮点库调用的目标码. 警告:所需的库不是GNU CC的组成部分.一般说来GC
C使用该机型本地C 编译器的相应部件,但是作交叉编译时却不能直接使用.你必须自
己管理提供合适的函数库用于交叉编译.
-mshort
认为int类型是16位宽,相当于short int.
-mnobitfield
不使用位域(bit-field)指令. `-m68000'隐含指定了`-mnobitfield'.
-mbitfield
使用位域指令. `-m68020'隐含指定了`-mbitfield'.如果你使用未改装的gcc,这就
是 默认选项.
-mrtd
采用另一种函数调用约定,函数接受固定数目的参数,用rtd指令返回,该指令返回时
弹出栈内的参数.这个 方法能够使调用者节省一条指令,因为他这里不需要弹出参数
这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数
,你就不能使用这个选项.
此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成
错误的调用代码.
另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况
下,多余的参数被安全无害的忽略.)
68010和68020处理器支持rtd指令,但是68000不支持.
下面是针对VAX定义的`-m'选项:
-munix
禁止输出某些跳转指令(aobleq等等), VAX的UNIX汇编器无法跨越长范围(long ran
ges) 进行处理.
-mgnu
如果使用GNU汇编器,则输出那些跳转指令,
-mg
输出g-format浮点数,取代d-format.
下面是SPARC支持的`-m'选项开关:
-mfpu
-mhard-float
输出包含浮点指令的目标码.这是缺省选项.
-mno-fpu
-msoft-float
输出包含浮点库调用的目标码. 警告:没有为SPARC提供GNU浮点库.一般说来使用该
机型本地C编译器 的相应部件,但是不能直接用于交叉编译.你必须自己安排,提供用
于交叉编译的库函数.
-msoft-float改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有
意义.
-mno-epilogue
-mepilogue
使用-mepilogue (缺省)选项时,编译器总是把函数的退出代码放在函数的尾部.任何
在函数中间 的退出语句(例如C中的return语句)将产生出跳转指令指向函数尾部.
使用-mno-epilogue选项时,编译器尽量在每个函数退出点嵌入退出代码.
-mno-v8
-mv8
-msparclite
这三个选项选择不同种类的SPARC系统.
默认情况下(除非特别为Fujitsu SPARClite配置), GCC生成SPARC v7目标码.
-mv8生成SPARC v8目标码.他和v7目标码唯一的区别是,编译器生成整数乘法和整数
除法指令, SPARC v8支持该指令,而v7体系不支持.
-msparclite生成SPARClite目标码.增加了SPARClite支持的整数乘法,整数除法单步
扫描 (integer divide step and scan (ffs))指令. v7体系不支持这些指令.
-mcypress
-msupersparc
这两个选项选择处理器型号,针对处理器进行代码优化.
-mcypress选项(默认项)使编译器对Cypress CY7C602芯片优化代码, SparcStation
/SparcServer 3xx系列使用这种芯片.该选项也适用于老式的SparcStation 1, 2,
IPX 等机型..
-msupersparc选项使编译器对SuperSparc处理器优化代码, SparcStation 10, 100
0 和系列使用这种芯片.同时该选项启用完整的SPARC v8指令集.
下面是针对Convex定义的`-m'选项:
-mc1
输出C1的目标码.当编译器对C1配置时,这是默认选项.
-mc2
输出C2的目标码.当编译器对C2配置时,这是默认选项.
-margcount
在每个参数列表的前面放置一个参数计数字(argument count word).某些不可移植
的Convex和Vax 程序需要这个参数计数字. (调试器不需要他,除非函数带有变长参
数列表;这个信息存放在符号表中.)
-mnoargcount
忽略参数计数字.如果你使用未改装的gcc,这是默认选项.
下面是针对AMD Am29000定义的`-m'选项:
-mdw
生成的目标码认为DW置位,就是说,字节和半字操作由硬件直接支持.该选项是默认选
项.
-mnodw
生成的目标码认为DW没有置位.
-mbw
生成的目标码认为系统支持字节和半字写操作.该选项是默认选项.
-mnbw
生成的目标码认为系统不支持字节和半字写操作.该选项隐含开启了`-mnodw'选项.
-msmall
使用小内存模式,小内存模式假设所有函数的地址位于某个256 KB段内,或者所有函
数的绝对地址小于256K.这样 就可以用call指令代替const, consth, calli指令序
列.
-mlarge
假设不能使用call指令;这是默认选项.
-m29050
输出Am29050的目标码.
-m29000
输出Am29000的目标码.这是默认选项.
-mkernel-registers
生成的目标码引用gr64-gr95寄存器而不是gr96-gr127寄存器.该选项可以用于编译
内核代码,内核需要一组全局寄存器,这些全局寄存器和用户模式使用的寄存器完全
无关.
注意,使用这个选项时, `-f'选项中的寄存器名字必须是normal, user-mode, name
s.
-muser-registers
使用普通全局寄存器集gr96-gr127.这是默认选项.
-mstack-check
在每次堆栈调整后插入一条__msp_check调用.这个选项常用于内核代码.
下面是针对Motorola 88K体系定义的`-m'选项:
-m88000
生成的目标码可以在m88100和m88110上正常工作.
-m88100
生成的目标码在m88100上工作的最好,但也可以在m88110上运行.
-m88110
生成的目标码在m88110上工作的最好,可能不能在m88100上运行.
-midentify-revision
在汇编器的输出端包含一条ident指令,记录源文件名,编译器名字和版本,时标,以及
使用的编译选项,
-mno-underscores
在汇编器的输出端,符号名字前面不添加下划线.默认情况是在每个名字前面增加下
划线前缀.
-mno-check-zero-division
-mcheck-zero-division
早期型号的88K系统在除零操作上存在问题,特定情况下许多机器无法自陷.使用这些
选项可以避免包含(或可以 显明包含)附加的代码,这些代码能够检查除零错,发送例
外信号. GCC所有88K的配置默认使用 `-mcheck-zero-division'选项.
-mocs-debug-info
-mno-ocs-debug-info
包含(或忽略)附加的调试信息(关于每个栈架结构中寄存器的使用), 88Open Objec
t Compatibility Standard, ``OCS'',对此信息做了说明. GDB不需要这些额外信息
DG/UX, SVr4,和Delta 88 SVr3.2的默认配置是包含调试信息,其他88k机型的默认
配置是忽略这个信息.
-mocs-frame-position
-mno-ocs-frame-position
强制(或不要求)把寄存器值存储到栈架结构中的指定位置(按OCS的说明). DG/UX,
Delta88 SVr3.2和 BCS的默认配置使用`-mocs-frame-position'选项;其他88k机型
的默认配置是 `-mno-ocs-frame-position'.
-moptimize-arg-area
-mno-optimize-arg-area
控制如何在堆栈结构中存储函数参数. `-moptimize-arg-area'节省空间,但是有可
能宕掉某些 调试器(不是GDB). `-mno-optimize-arg-area'证实比标准选项好.默认
情况下GCC不优化参数域.
-mshort-data-
num通过和r0关联,产生较小的数据引用(data reference),这样就可以用单指令调入
一个数值(而不是平常的双指令).用户通过选项中的num控制改变哪种数据引用.例
如,如果你指定了 `-mshort-data-512',那么受影响的数据引用是小于512字节的数
据移动. -mshort-data-num选项对大于64K的num 无效.
-mserialize-volatile
-mno-serialize-volatile
产生,或不产生代码来保证对易变内存访问的结果一致.
对于常用的处理器子型号, GNU CC始终默认保证这种一致性.如何实现结果一致取决
于处理器子型号.
m88100处理器不对内存引用重新安排,因此访问结果始终一致.如果使用了`-m88100
'选项, GNU CC 不产生任何针对结果一致的特别指令.
m88110处理器的内存引用顺序并不始终符合指令请求的引用顺序.特别是某条读取指
令可能在先前的存储指令之前执行. 多处理器环境下,乱序访问扰乱了易变内存访问
的结果一致.因此当使用`-m88000'或`-m88110' 选项时, GNU CC在适当的时候产生
特别的指令迫使执行顺序正确.
这些用于保证一致性的额外代码有可能影响程序的性能.如果你确认能够安全地放弃
这种保证,你可以使用 `-mno-serialize-volatile'选项.
如果你使用`-m88100'选项,但是需要在m88110处理器上运行时的结果一致,你应该加
上 `-mserialize-volatile'选项.
-msvr4
-msvr3
打开(`-msvr4')或关闭(`-msvr3')和System V第四版(SVr4)相关的 编译器扩展.效
果如下:
*
输出哪种汇编语法(你可以使用`-mversion-03.00'选项单独选择).
*
`-msvr4'使C预处理器识别`#pragma weak'指令
*
`-msvr4'使GCC输出额外的声明指令(declaration directive),用于SVr4.
除了SVr4配置, `-msvr3'是所有m88K配置的默认选项.
-mtrap-large-shift
-mhandle-large-shift
包含一些指令,用于检测大于31位的位移(bit-shift);根据相应的选项,对这样的位
移发出自陷 (trap)或执行适当的处理代码.默认情况下, GCC对大位移不做特别处理
-muse-div-instruction
很早以前的88K型号没有(div)除法指令,因此默认情况下GCC避免产生这条指令.而这
个选项告诉GCC该指令是 安全的.
-mversion-03.00
在DG/UX配置中存在两种风格的SVr4.这个选项修改-msvr4 ,选择hybrid-COFF或 re
al-ELF风格.其他配置均忽略该选项.
-mwarn-passed-structs
如果某个函数把结构当做参数或结果传递, GCC发出警告.随着C语言的发展,人们已
经改变了传递结构的约定, 它往往导致移植问题.默认情况下, GCC不会发出警告.
下面的选项用于IBM RS6000:
-mfp-in-toc
-mno-fp-in-toc
控制是否把浮点常量放到内容表(TOC)中,内容表存放所有的全局变量和函数地址.默
认情况下, GCC把浮点常量放到 这里;如果TOC溢出, `-mno-fp-in-toc'选项能够减
少TOC的大小,这样就可以避免溢出.
下面的`-m'选项用于IBM RT PC:
-min-line-mul
对于整数乘法使用嵌入代码.这是默认选项.
-mcall-lib-mul
对于整数乘法使用lmul$$ .
-mfull-fp-blocks
生成全尺寸浮点数据块,包括IBM建议的最少数量的活动空间(scratch space).这是
默认选项.
-mminimum-fp-blocks
不要在浮点数据块中包括额外的活动空间.这样就产生较小但是略慢的可执行程序,
因为活动空间必须动态分配.
-mfp-arg-in-fpregs
采用不兼容IBM调用约定的调用序列,通过浮点寄存器传送浮点参数.注意,如果指定
了这个选项, varargs.h和stdargs.h将无法支持浮点单元.
-mfp-arg-in-gregs
使用正常的调用约定处理浮点参数.这是默认选项.
-mhc-struct-return
通过内存返回大于一个字的结构,而不是通过寄存器.用于兼容MetaWare HighC (hc
)编译器.使用 `-fpcc-struct-return'选项可以兼容Portable C编译器(pcc).
-mnohc-struct-return
如果可以,通过寄存器返回某些大于一个字的结构.这是默认选项.如果打算兼容IBM
提供的编译器,请使用 `-fpcc-struct-return'或`-mhc-struct-return'选项.
原文转自:www.ltesting.net
篇5:GCC 手册(续)Unix系统
续 连接器选项(LINKER OPTION) 下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行 连 接,他们就毫无意义. object-file-name 如果某些文件没有特别明确的后缀a special recognized suffix, G CC 就认为他们 是目标文件或库文件. (根据
续连接器选项(LINKER OPTION)
下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行 连
接,他们就毫无意义.
object-file-name
如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们
是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GC
C执行连接操作,这些目标文件将成为连接器的输入文件.
-llibrary
连接名为library的库文件.
连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a'.连
接器会 当做文件名得到准确说明一样引用这个文件.
搜索目录除了一些系统标准目录外,还包括用户以`-L'选项指定的路径.
一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archiv
e file).连接器处理归档文件的 方法是:扫描归档文件,寻找某些成员,这些成员的
符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的 目标文件,而不
是库文件,就把这个目标文件按平常方式连接进来.指定`-l'选项和指定文件名的唯
一区别是, `-l选项用`lib'和`.a'把library包裹起来,而且搜索一些目录.
-lobjc
这个-l选项的特殊形式用于连接Objective C程序.
-nostartfiles
不连接系统标准启动文件,而标准库文件仍然正常使用.
-nostdlib
不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.
-static
在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上
无效.
-shared
生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统
支持该选项.
-symbolic
建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警
告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs'取代).只有部分系统支持该
选项.
-Xlinker option
把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这
些选项.
如果需要传递携带参数的选项,你必须使用两次`-Xlinker',一次传递选项,另一次传
递他的参数. 例如,如果传递`-assert definitions',你必须写成`-Xlinker -asse
rt -Xlinker definitions',而不能写成`-Xlinker ”-assert definitions“',因为
这样会把整个 字符串当做一个参数传递,显然这不是连接器期待的.
-Wl,option
把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.
-u symbol
使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多
个 `-u'选项,各自跟上不同的符号,使得连接器调入附加的库模块.
目录选项(DIRECTORY OPTION)
下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:
-Idir
在头文件的搜索路径列表中添加dir 目录.
-I-
任何在`-I-'前面用`-I'选项指定的搜索路径只适用于`#include ”file“'这种情况
;他们不能用来搜索`#include
如果用`-I'选项指定的搜索路径位于`-I-'选项后面,就可以在这些路径中搜索所有
的 `#include'指令. (一般说来-I选项就是这么用的.)
还有, `-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include
”file“'的第一选择.没有办法克服`-I-'选项的这个效应.你可以指定 `-I.'搜索那
个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结
果通常 令人满意.
`-I-'不影响使用系统标准目录,因此, `-I-'和`-nostdinc'是不同的选项.
-Ldir
在`-l'选项的搜索路径列表中添加dir目录.
-Bprefix
这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.
编译器驱动程序需要执行某些下面的子程序: `cpp', `clearcase/” target=“_blank” >cc1' (或C++的 `cc1plus')
, `as'和`ld'.他把prefix当作欲执行的程序的 前缀,既可以包括也可以不包括`ma
chine/version/'.
对于要运行的子程序,编译器驱动程序首先试着加上`-B'前缀(如果存在).如果没有
找到文件,或没有指定 `-B'选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/'
和 `/usr/local/lib/gcc-lib/'.如果仍然没能够找到所需文件,编译器就在`PATH'
环境变量 指定的路径中寻找没加任何前缀的文件名.
如果有需要,运行时(run-time)支持文件`libgcc.a'也在`-B'前缀的搜索范围之内.
如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法
没有找到这个文件,就不连接他了.多数 情况的多数机器上, `libgcc.a'并非必不可
少.
你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就
和上面说的 一样用做前缀.如果同时指定了`-B'选项和GCC_EXEC_PREFIX变量,编译
器首先使用 `-B'选项,然后才尝试环境变量值.
警告选项(WARNING OPTION)
警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在
错误.
下列选项控制GNU CC产生的警告的数量和类型:
-fsyntax-only
检查程序中的语法错误,但是不产生输出信息.
-w
禁止所有警告信息.
-Wno-import
禁止所有关于#import的警告信息.
-pedantic
打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的
程序.
无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序
需要`-ansi' 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持
使用这个选项可以拒绝这些程序.没有理由 使用这个选项,他存在只是为了满足一
些书呆子(pedant).
对于替选关键字(他们以`__'开始和结束) `-pedantic'不会产生警告信息. Pedant
ic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种
转义措施,应用程序最好 避免.
-pedantic-errors
该选项和`-pedantic'类似,但是显示错误而不是警告.
-W
对下列事件显示额外的警告信息:
*
非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变
这些警告仅在优化编译时发生.
编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个 信
号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会
得到警告,因为无法在可能出现问题 的地方调用longjmp.
*
既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例
如,下面的函数将导致这种警告:
foo (a)
{
if (a >0)
return a;
}
由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现 虚假
警告.
*
表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告
,应该把未使用的表达式强制转换 为void类型.例如,这样的表达式`x[i,j]'会导致
警告,而`x[(void)i,j]'就不会.
*
无符号数用`>'或`<='和零做比较.
-Wimplicit-int
警告没有指定类型的声明.
-Wimplicit-function-declaration
警告在声明之前就使用的函数.
-Wimplicit
同-Wimplicit-int和-Wimplicit-function-declaration.
-Wmain
如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数
用于外部连接, 返回int数值,不需要参数,或指定两个参数.
-Wreturn-type
如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不
带返回值的 return语句,如果他们所属的函数并非void类型.
-Wunused
如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某
条语句的运算结果显然没有使用, 编译器就发出警告.
-Wswitch
如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,
编译器 就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的ca
se语句同样会 导致这个警告.
-Wcomment
如果注释起始序列`/*'出现在注释中,编译器就发出警告.
-Wtrigraphs
警告任何出现的trigraph (假设允许使用他们).
-Wformat
检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.
-Wchar-subscripts
警告类型是char的数组下标.这是常见错误,程序员经常忘记在某些机器上char有符
号.
-Wuninitialized
在初始化之前就使用自动变量.
这些警告只可能做优化编译时出现,因为他们需要数据流信息,只有做优化的时候才
估算数据流信息.如果不指定 `-O'选项,就不会出现这些警告.
这些警告仅针对等候分配寄存器的变量.因此不会发生在声明为volatile的变量上面
,不会发生在已经 取得地址的变量,或长度不等于1, 2, 4, 8字节的变量.同样也不
会发生在结构,联合或数组上面,即使他们在 寄存器中.
注意,如果某个变量只计算了一个从未使用过的值,这里可能不会警告.因为在显示警
告之前,这样的计算已经被 数据流分析删除了.
这些警告作为可选项是因为GNU CC还没有智能到判别所有的情况,知道有些看上去错
误的代码其实是正确的.下面是 一个这样的例子:
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
如果y始终是1, 2或3,那么x总会被初始化,但是GNU CC不知道这一点.下面是 另一个
普遍案例:
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
这里没有错误,因为只有设置了save_y才使用他.
把所有不返回的函数定义为volatile可以避免某些似是而非的警告.
-Wparentheses
在某些情况下如果忽略了括号,编译器就发出警告.
-Wtemplate-debugging
当在C++程序中使用template的时候,如果调试(debugging)没有完全生效,编译器就
发出警告. (仅用于C++).
-Wall
结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,我们相信,恰当结
合宏的使用能够 轻易避免这些用法,
GCC 手册(续)Unix系统
,
剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被编译器
警告 的程序结构,可以合理的用在“干净的”程序中.
-Wtraditional
如果某些程序结构在传统C中的表现和ANSI C不同,编译器就发出警告.
*
宏参出现在宏体的字符串常量内部.传统C会替换宏参,而ANSI C则视其为常量的一部
分.
*
某个函数在块(block)中声明为外部,但在块结束后才调用.
*
switch语句的操作数类型是long.
-Wshadow
一旦某个局部变量屏蔽了另一个局部变量,编译器就发出警告.
-Wid-clash-len
一旦两个确定的标识符具有相同的前len个字符,编译器就发出警告.他可以协助你开
发一些将要在某些 过时的,危害大脑的编译器上编译的程序.
-Wpointer-arith
任何语句如果依赖于函数类型的大小(size)或者void类型的大小,编译器就发出警告
GNU C为了 便于计算void *指针和函数指针,就把这些类型的大小定义为1.
-Wcast-qual
一旦某个指针强制类型转换以便移除类型修饰符时,编译器就发出警告.例如,如果把
const char * 强制转换为普通的char *时,警告就会出现.
-Wcast-align
一旦某个指针类型强制转换时,导致目标所需的地址对齐(alignment)增加,编译器就
发出警告.例如,某些机器上 只能在2或4字节边界上访问整数,如果在这种机型上把
char *强制转换成int *类型, 编译器就发出警告.
-Wwrite-strings
规定字符串常量的类型是const char[length],因此,把这样的地址复制给 non-con
st char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字符串常
量 的代码,但是你必须非常仔细的在声明和原形中使用const,否则他们只能带来麻
烦;所以我们没有让 `-Wall'提供这些警告.
-Wconversion
如果某函数原形导致的类型转换和无函数原形时的类型转换不同,编译器就发出警告
这里包括定点数和浮点数的 互相转换,改变定点数的宽度或符号,除非他们和缺省
声明(default promotion)相同.
-Waggregate-return
如果定义或调用了返回结构或联合的函数,编译器就发出警告. (从语言角度你可以
返回一个数组,然而同样会 导致警告.)
-Wstrict-prototypes
如果函数的声明或定义没有指出参数类型,编译器就发出警告. (如果函数的前向引
用说明指出了参数类型,则允许后面 使用旧式风格的函数定义,而不会产生警告.)
-Wmissing-prototypes
如果没有预先声明函数原形就定义了全局函数,编译器就发出警告.即使函数定义自
身提供了函数原形也会产生这个警告. 他的目的是检查没有在头文件中声明的全局
函数.
-Wmissing-declarations
如果没有预先声明就定义了全局函数,编译器就发出警告.即使函数定义自身提供了
函数原形也会产生这个警告.这个选项 的目的是检查没有在头文件中声明的全局函
数.
-Wredundant-decls
如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并
且毫无差别.
-Wnested-externs
如果某extern声明出现在函数内部,编译器就发出警告.
-Wenum-clash
对于不同枚举类型之间的转换发出警告(仅适用于C++).
-Wlong-long
如果使用了long long 类型就发出警告.该警告是缺省项.使用`-Wno-long-long' 选
项能够防止这个警告. `-Wlong-long'和`-Wno-long-long'仅在 `-pedantic'之下才
起作用.
-Woverloaded-virtual
(仅适用于C++.)在继承类中,虚函数的定义必须匹配虚函数在基类中声明的类型特征
(type signature).当 继承类声明了某个函数,它可能是个错误的尝试企图定义一个
虚函数,使用这个选项能够产生警告:就是说,当某个函数和基类 中的虚函数同名,但
是类型特征不符合基类的任何虚函数,编译器将发出警告.
-Winline
如果某函数不能内嵌(inline),无论是声明为inline或者是指定了-finline-functi
ons 选项,编译器都将发出警告.
-Werror
视警告为错误;出现任何警告即放弃编译.
调试选项(DEBUGGING OPTION)
GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错:
-g
以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能够使
用这些调试信息.
在大多数使用stabs格式的系统上, `-g'选项启动只有GDB才使用的额外调试信息;这
些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如果
你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs', `-gxcoff+', `
-gxcoff', `-gdwarf+',或`-gdwarf' (见下文).
和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制造
一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地
方;某些语句因为计算结果是常量或已经确定而 没有执行;某些语句在其他地方执行
,因为他们被移到循环外面了.
然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的
如果GNU CC支持输出多种调试信息,下面的选项则非常有用.
-ggdb
以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展.
-gstabs
以stabs格式(如果支持)输出调试信息,不包括GDB扩展.这是大多数BSD系统上DBX使
用的格式.
-gstabs+
以stabs格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使
用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
-gcoff
以COFF格式(如果支持)输出调试信息.这是在System V第四版以前的大多数System
V系统上SDB使用的 格式.
-gxcoff
以XCOFF格式(如果支持)输出调试信息.这是IBM RS/6000系统上DBX调试器使用的格
式.
-gxcoff+
以XCOFF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使
用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
-gdwarf
以DWARF格式(如果支持)输出调试信息.这是大多数System V第四版系统上SDB使用的
格式.
-gdwarf+
以DWARF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使
用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel
-gdwarflevel
请求生成调试信息,同时用level指出需要多少信息.默认的level值是2.
Level 1输出最少量的信息,仅够在不打算调试的程序段内backtrace.包括函数和外
部变量的描述,但是 没有局部变量和行号信息.
Level 3包含更多的信息,如程序中出现的所有宏定义.当使用`-g3'选项的时候,某些
调试器支持 宏扩展.
-p
产生额外代码,用于输出profile信息,供分析程序prof使用.
-pg
产生额外代码,用于输出profile信息,供分析程序gprof使用.
-a
产生额外代码,用于输出基本块(basic block)的profile信息,它记录各个基本块的
执行次数,供诸如 tcov此类的程序分析.但是注意,这个数据格式并非tcov期待的.最
终GNU gprof 将处理这些数据.
-ax
产生额外代码,用于从'bb.in'文件读取基本块的profile参数,把profile的结果写到
'bb.out' 文件. `bb.in'包含一张函数列表.一旦进入列表中的某个函数, profile
操作就开始,离开最外层的函数后, profile操作就结束.以`-'为前缀名的函数排除
在profile操作之外.如果函数名不是唯一的,它可以写成 `/path/filename.d:func
tionname'来澄清. `bb.out'将列出一些有效的文件名.这四个函数名具有 特殊含义
: `__bb_jumps__'导致跳转(jump)频率写进`bb.out'. `__bb_trace__'导致基本块
序列通过 管道传到`gzip',输出`bbtrace.gz'文件. `__bb_hidecall__'导致从跟踪
(trace)中排除call 指令. `__bb_showret__'导致在跟踪中包括返回指令.
-dletters
编译的时候,在letters指定的时刻做调试转储(dump).用于调试编译器.大多数转储
的文件名 通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').
-dM
预处理结束的时候转储所有的宏定义,不输出到文件.
-dN
预处理结束的时候转储所有的宏名.
-dD
预处理结束的时候转储所有的宏定义,同时进行正常输出.
-dy
语法分析(parse)的时候在标准错误转储调试信息.
-dr
RTL阶段后转储到`file.rtl'.
-dx
仅对函数生成RTL,而不是编译.通常和`r'联用.
-dj
第一次跳转优化后转储到`file.jump'.
-ds
CSE (包括有时候跟在CSE后面的跳转优化)后转储到`file.cse'.
-dL
循环优化后转储到`file.loop'.
-dt
第二次CSE处理(包括有时候跟在CSE后面的跳转优化)后转储到`file.cse2'.
-df
流程分析(flow analysis)后转储到`file.flow'.
-dc
指令组合(instruction combination)后转储到`file.combine'.
-dS
第一次指令安排(instruction schedule)后转储到`file.sched'.
-dl
局部寄存器分配后转储到`file.lreg'.
-dg
全局寄存器分配后转储到`file.greg'.
-dR
第二次指令安排(instruction schedule)后转储到`file.sched2'.
-dJ
最后一次跳转优化后转储到`file.jump2'.
-dd
推迟分支调度(delayed branch scheduling)后转储到`file.dbr'.
-dk
寄存器-堆栈转换后转储到`file.stack'.
-da
产生以上所有的转储.
-dm
运行结束后,在标准错误显示内存使用统计.
-dp
在汇编输出加注指明使用了哪些模式(pattern)及其替代模式.
-fpretend-float
交叉编译的时候,假定目标机和宿主机使用同样的浮点格式.它导致输出错误的浮点
常数,但是在目标机上运行的时候, 真实的指令序列有可能和GNU CC希望的一样.
-save-temps
保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.因此,
用`-c -save-temps'选项编译`foo.c '会生成` foo.cpp'和`foo.s' 以及`foo.o'文
件.
-print-file-name=library
显示库文件library的全路径名,连接时会使用这个库---其他什么事情都不作.根据
这个选项, GNU CC既不编译,也不连接,仅仅显示文件名.
原文转自:www.ltesting.net
篇6:ubuntu系统怎么安装gcc编程工具?
ubuntu系统怎么安装gcc编程工具?ubuntu与windows系统不同,下面分享ubuntu系统安装gcc编程工具的详细教程,需要的朋友可以参考下
介绍如何在ubuntu系统中安装Gcc编程工具,操作环境为虚拟机中,
软件名称:gcc编译器工具 windows版(gcc for windows)软件大小:12.3MB更新时间:-04-221、打开自己的电脑,之后打开终端,如果桌面上有快捷方式,就直接打开就行,没有的话可以按下键盘上的Ctrl+Alt+T组合键。
2、之后就可以可以进行安装了,因为要下载文件,所以必须进行连网,会进行自动的安装,安装好的之后就是如下图所示,
3、系统如果不带vim的编辑工具,可以向下边那样进行安装,很快就可以安装好了,安装好了如下图:
4、之后在主目录里写一个.c文件进行测试就写一个常见的hello程序,如下图所示。
5、之后就可以进行编译了,切记要输入正确,有时候一个空格的错误可能造成找不到命令。看下图第一个就是错误的输入,现的是正确的输入。
6、之后再输入运行命令就可以运行了。结果打印在终端上。
注意事项:不会操作的朋友可以先建立一个快照,有问题可以还原。
篇7:拼图秀安装手册
环境需求
操作系统:Windows / Server、Redhat/Ubuntu及其它Linux操作系统
Web服务器:IIS6、Apache 2.x ,建议开启URL Rewrite以支持伪静态
PHP: 5.2.0 及以上,开启 GD、CURL、ICONV模块
Mysql: 5.0 及以上
通常大多数虚拟主机提供商、云主机服务商均能提供如上环境支持,基于性能、安全性、稳定性考虑,建议采用Linux操作系统,在确认环境没有问题后,请按照下面步骤进行操作(以下过程以 Linux 服务器为例,Windows服务器请参见相关文档):
第1步:上传程序
在获得安装程序包后,通过FTP工具将安装包上传至Web服务器,解压至Web目录,如:/var/www/html 。如果需要设置Apache虚拟主机,可参见:httpd.apache.org/docs/2.2/zh-cn/vhosts/
解压完成后,请设置如下目录为可读可写:
/data/
/data/attachments
/log
/tmp
/config.php
操作命令如:
chmod -R 777 data
chmod -R 777 data/attachments
chmod -R 777 log
chmod -R 777 tmp
chmod -R 777 config.php
第2步:运行安装程序
首先确保Apache、Mysql已经正常运行,然后打开浏览器,访问拼图秀的Web目录,如:x.x.x.x/index.php?c=install ,将看到类似如下的安装界面:
用户协议
只有同意有户协议后才能继续安装,
第3步:开始安装
接受用户协议后,安装程序将自动检测服务器环境是否符合运行需求,如果检测有不满足的选项,请进行配置或联系系统管理员,同时欢迎在技术支持社区提问。
环境检测
第4步:初使化配置
如果环境检测通过,将需要提供数据库配置信息,同时系统将跟据您填写的管理员账号信息自动生成管理员账号,请跟据自已的实际情况进行填写,如果疑问请联系系统管理,同时欢迎在技术支持社区提问。
安装配置
第5步:完成安装
如果安装一切正常,您将看到如下页面,表示安装已正常完成,您可以通过刚才提供的管理员账号,登录至后台管理中心进行站点属性配置(站点名称等)。
完成安装
最后祝一切顺利,如在安装过程中有任何疑问,欢迎在技术支持社区提问。
篇8:virtualbox中,CentOS通过ISO安装gcc
步骤:
先通过VM加载 ISO文件,然后执行以下命令:
mount /dev/cdrom /media/CentOS
yum --disablerepo=\* --enablerepo=c6-media install gcc*
★员工手册
★安装合同
★安装合同
文档为doc格式