GNU gcc 使用手册

<序 >  

伟大的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++库.

编译命令:

gcc [option | filename]
g
++  [option | filename]

 

2. 编译步骤:

gcc编译器在编译时, 都需要用四个步骤里的一个或多个处理输入文件, 这四个步骤是:

  • 预处理(Pre-Processing)
  • 编译(Compilation)
  • 汇编(Assembly)
  • 连接(Linking)

在这个过程中, 源文件的后缀名控制着编译器的缺省设定. 这个后缀指示出了程序代码所用语言

  • gcc: 认为预处理后的文件(.i)是C文件.
  • g++: 认为预处理后的文件(.i)是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, 否则连接总是最后的步骤.

 

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)

-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 -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -sion -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-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 -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路径搜索.

你可能感兴趣的:(C++,汇编,gcc,语言,编译器,preprocessor)