<序 >
伟大的GNU认为man手册是Open Source发展的过时产物, 于是他们针对各种当家软件出了各自的手册, 如GNU Emacs, GNU Vim, 当然gcc是不可缺少的, 这是Stallman一生最伟大的产物之一.
Richard Stallman 是Open Source界的伟大人物之一, 他是gcc, gdb, emacs的作者, 名声在OS界不可谓不大. 有一次, 他去某企业面试, 面试方问他, 你会用gdb吗? Stallman一语惊人: 会, 那就是我写的.
好了, 闲话少说, 还是说gcc吧.
1. 前言:
gcc是一款编译器, 它主要在UNIX-BASE的系统上使用, windows版也有, 集成在MinGW中, 为了把GNU推广到Windows, 真是煞费苦心啊.
gcc编译器主要用于编译C和C++程序, 编译C++程序时通常使用g++命令, 实际上是gcc连接了libstdc++库.
编译命令:
2. 编译步骤:
gcc编译器在编译时, 都需要用四个步骤里的一个或多个处理输入文件, 这四个步骤是:
在这个过程中, 源文件的后缀名控制着编译器的缺省设定. 这个后缀指示出了程序代码所用语言
对于具体后缀, 不同的步骤有:
其他后缀名的文件被传递给连接器(linker).通常包括:
除非使用了-c -S或-E, 否则连接总是最后的步骤.
3. 选项总览:
选项必须分立给出: `-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 -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs
警告选项(Warning Option)
RS6000选项
RT选项
-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-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 -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -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 -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon
i960选项
-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align
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 -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm
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=library -print-libgcc-file-name -print-prog-name=program
优化选项(Optimization Option)
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-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 -nostdinc -P -Umacro -undef
汇编器选项(Assembler Option)
-Wa,option
连接器选项(Linker Option)
-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -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 -msparclite -mv8 -msupersparc -mcypress
Convex选项
-margcount -mc1 -mc2 -mnoargcount
AMD29K选项
-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers
M88K选项
-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-divi
4. 总体选项介绍:
-x language
明确指出源代码所使用的语言为language, 而不通过文件后缀处理. 这个选项后使选项后面的文件都按照这个language语言判断, 直到遇到下一个-x. language的可选值有: `c', `objective-c', `c-header', `c++', `cpp-output', `assembler',和`assembler-with-cpp'
-x none
关闭任何对于语言的说明, 依然文件后缀处理后面的文件.
-c
编译或汇编源文件, 生成目标文件(.o), 但不做连接. 这个选项同时也会使gcc忽略-c后面无法识别的文件.(它们不需要编译或汇编)
-S
编译后停止而不进行汇编, 生成汇编语言文件(.s).
-E
预处理后停止而不进行编译. 预处理后的代码送给标准输出.
-o filename
指定输出文件为filename. 该选项不在乎GCC要产生什么输出, 无论是可执行文件, 目标文件, 汇编文件, 还是预处理后的代码. 如果没有-o选项, 默认的输出:
可执行文件: a.out
目标文件: source.suffix生成source.o
汇编文件: source.suffix生成source.s
-v
在标准出错显示编译时的指令, 并显示GCC的版本.
-pipe
在编译过程的不同阶段使用管道而非临时文件进行通信.
5. 语言选项:
这些选项表示C语言的不同标准, 又被称为C语言的"方言".
-ansi
支持符合ANSI标准的C代码. 这样就会关闭一些关键字的使用, 如asm, typeof, inline等.
其他选项在使用到时陆续添加.
6. 预处理选项:
下列选项针对C预处理器. 某些选项必须和'-E'一起用, 因为他们的结果不能用于编译.
-C
告诉处理器不要丢弃注释, 与'-E'配合使用.
-P
告诉处理器不要产生#line命令, 与'-E'配合使用.
-M
告诉处理器生成一个make规则, 用于描述各目标文件的依赖关系. 对于每个源文件输出一个make规则, 这个规则是根据#include产生的. '-M'选项隐含了'-E'.
-MG
把缺少的头文件按存在看待, 并且假定它们和源文件在同一个目录. 必须和'-M'一起使用.
-MM
和'-M'类似, 但输出结果仅限于用户头文件, 不包括系统头文件.
-MD
和'-M'类似, 但是把依赖信息输出在文件中(.d), 同时继续指定编译工作.
-MMD
和'-MD'类似, 但输出结果仅限于用户头文件.
-H
除了其他普通操作, GCC显示引用过的头文件名.
-Dmacro
定义宏macro, 宏的内容定义为字符'1'.
-Dmacro=defn
定义宏macro, 宏的内容定义为defn.
-Umacro
取消定义宏macro. '-U'选项在'-D'之后处理, 但是优先于'-include', '-imacros'.
-dM
输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E'选项使用.
-dD
把所有的宏定义传递到输出端,按照出现的顺序显示.
-dN
和'-dD'类似, 但是只显示宏的名字, 而不显示值.
7. 其他选项:
gcc与gdb, ld, dbx等都有驱动选项, 这些开发工具都为gcc提供了驱动接口.
-g
使编译器进行debug编译, 连接成的可执行文件可被gdb进行调试用.
-lLIB
使编译器在连接时引用LIB库, 这个库可以是.so的动态库, 也可以是.a的归档库文件. 通常库的文件名为libxxx.so或libxxx.a, 要连接这个库只需要-lxxx, 而不用加lib.
-LPATH
使编译器在连接库的时候除了默认的库搜索路径, 还可去PATH路径搜索.