2008年1月15日星期二

gcc基本的使用方法及常用指令(zt)

gcc基本的使用方法及常用指令
前言

  编译器在编译过程中,先将程式码编译成 object 档,然後再和程式库联结,成为可执行档。故一个编译器须提供的参数主要有几类:
  1.指定编译器编出的object 档或是可执行档档名。
  2.在编译过程做最佳化,可提升程式的执行速度。
  3.设定搜寻程式库的标头档 (header file) 及程式库档的目录及指定程式库档档名。
  提供进一步的资讯以便使用者找寻程式中的错误。

  以下便以这四个大类分别介绍。
  注意:下面在不同类别中所介绍的参数,几乎都可以混合著使用。
  1.设定编译出的 object 档档名或是可执行档档名:
  参数: -o out_put_filename
  说明: 指定编译出的档名为 out_put_filename。
  范例: 本例将程式码 'test.c' 编译成可执行档,并设定档名为 'test'。
  gcc test.c -o test

  2.在编译过程做最佳化
  参数: -O
  说明: 在编译过程做最佳化,以提升增快程式执行速度。
  范例: 本例将程式码 'test.c' 编译成可执行档 'test',并在编译过程做最佳化'。 
  gcc -O test.c -o test

  3.设定搜寻标头档目录、程式库档的目录及指定程式库档。
  3.1设定搜寻标头档目录
  参数: -Idir_name
  说明: 将目录 'dir_name' 设定为搜寻标头档目录之一。

  3.2设定搜寻程式库目录。
  参数: -Ldir_name
  说明: 将目录 'dir_name' 设定为搜寻程式库目录之一。

  3.3设定程式库档案。
  参数: -lname
  说明: 联结程式库 libname.a 。
  
  范例一:本例中假设你的程式档名为test.c,数学函数如 sin等,所要联结的程式库为 libm.a。
  gcc -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 test.c -o test
  范例二:本例中假设你的程式档名为 test.c,使用到 X window 函数,所需的 include 档放在 /usr/X11R6/include 中,所须联结的程式库放在 /usr/X11R6/lib,所要联结的程式库为 libX11.a。
  gcc -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 test.c -o test 
  提供进一步的资讯以便使用者找寻程式中的错误。

  参数: -Wall
  说明: 输出较多的警告讯息,以便找出程式的错误。
  范例: 编译 test.c 时输出较多的警告讯息。
  gcc -Wall test.c
  
  参数: -g
  说明: 在编译出可执行档时,附加执行时除错资讯,以供 gdb 读取 (若要使用 ABSoft 的除错程式,则须将参数改为 -gdwarf )。
  范例: 将 'test.c' 编译成可执行档 'test',并附加除错资讯。
  gcc -g test.c -o test
  
  进阶参数
  1. 仅编译成 object 档。
  参数: -c
  说明: 仅编译成 object 档而不进行程式库联结。
  范例: 将 test.c 编译成 object 档 test.o。
  gcc -c test.c -o test.o
  
  2. 联结数个 object 成可执行档。
  范例: 将 'test1.o'、'test2.o' 和程式库联结後成为可执行档 test。
  gcc test1.o test2.o -o test
  
  3. 观察宏展开情形:
  参数: -E
  说明:展开程式中的宏以便了解巨集是否依照预期方式展开。
  范例:将 test1.c 中的宏展开後储存到 test1.c.ext 。
  gcc -E test1.c > test1.c.ext
  
  4. 产生组合语言程式码:
  参数: -S
  范例:编译 test.c 产生对应的组合语言程式码档 test.s。
  gcc -S test.c -o test.s


GCC(1)   GNU Tools   GCC(1)
NAME
    gcc, g++ - GNU project C and C++ Compiler (v2.7)

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

WARNING
    The information in this man page is an extract from the
    full documentation of the GNU C compiler, and is limited
    to the meaning of the options.

    This man page is not kept up to date except when volun-
    teers want to maintain it.  If you find a discrepancy
    between the man page and the software, please check the
    Info file, which is the authoritative documentation.

    If we find that the things in this man page that are out
    of date cause significant confusion or complaints, we will
    stop distributing the man page. The alternative, updating
    the man page when we update the Info file, is impossible
    because the rest of the work of maintaining GNU CC leaves
    us no time for that. The GNU project regards man pages as
    obsolete and should not let them take time away from other
    things.

    For complete and current documentation, refer to the Info
    file `gcc' or the manual Using and Porting GNU CC (for
    version 2.0). Both are made from the Texinfo source file
    gcc.texinfo.

DESCRIPTION
    The C and C++ compilers are integrated.  Both process
    input files through one or more of four stages: prepro-
    cessing, compilation, assembly, and linking. Source file-
    name suffixes identify the source language, but which name
    you use for the compiler governs default assumptions:

    gcc  assumes preprocessed (.i) files are C and assumes C
   style linking.

    g++  assumes preprocessed (.i) files are C++ and assumes
   C++ style linking.

    Suffixes of source file names indicate the language and
    kind of processing to be done:

    .c  C source; preprocess, compile, assemble
    .C  C++ source; preprocess, compile, assemble
    .cc  C++ source; preprocess, compile, assemble
    .cxx C++ source; preprocess, compile, assemble
    .m  Objective-C source; preprocess, compile, assemble
    .i  preprocessed C; compile, assemble
    .ii  preprocessed C++; compile, assemble


GNU Tools   1993/10/13 1
GCC(1)   GNU Tools   GCC(1)


    .s  Assembler source; assemble
    .S  Assembler source; preprocess, assemble
    .h  Preprocessor file; not usually named on command line

    Files with other suffixes are passed to the linker. Com-
    mon cases include:

    .o  Object file
    .a  Archive file

    Linking is always the last stage unless you use one of the
    -c, -S, or -E options to avoid it (or unless compilation
    errors stop the whole process). For the link stage, all
    .o files corresponding to source files, -l libraries,
    unrecognized filenames (including named .o object files
    and .a archives) are passed to the linker in command-line
    order.

OPTIONS
    Options must be separate: `-dr' is quite different from
    `-d -r '.

    Most `-f' and `-W' options have two contrary forms: -fname
    and -fno-name (or -Wname and -Wno-name).  Only the non-
    default forms are shown here.

    Here is a summary of all the options, grouped by type.
    Explanations are in the following sections.

    Overall Options
   -c -S -E -o file -pipe -v -x language

    Language Options
   -ansi -fall-virtual -fcond-mismatch
   -fdollars-in-identifiers -fenum-int-equiv
   -fexternal-templates -fno-asm -fno-builtin
   -fno-strict-prototype -fsigned-bitfields
   -fsigned-char -fthis-is-variable
   -funsigned-bitfields -funsigned-char
   -fwritable-strings -traditional -traditional-cpp
   -trigraphs

    Warning Options
   -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 -Winline -Wmissing-prototypes
   -Wmissing-declarations -Wnested-externs -Wno-import
   -Wparentheses -Wpointer-arith -Wredundant-decls
   -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch
   -Wtemplate-debugging -Wtraditional -Wtrigraphs
   -Wuninitialized -Wunused -Wwrite-strings

GNU Tools   1993/10/13 2
GCC(1)   GNU Tools   GCC(1)


    Debugging Options
   -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 Options
   -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

    Preprocessor Options
   -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 Options
   -llibrary -nostartfiles -nostdlib -static -shared
   -symbolic -Xlinker option -Wl,option -u symbol

    Directory Options
   -Bprefix -Idir -I- -Ldir

    Target Options
   -b machine -V version

    Configuration Dependent Options
   M680x0 Options
   -m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881
   -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield
   -mrtd -mshort -msoft-float

   VAX Options
   -mg -mgnu -munix

   SPARC Options
   -mepilogue -mfpu -mhard-float -mno-fpu
   -mno-epilogue -msoft-float -msparclite -mv8
   -msupersparc -mcypress

   Convex Options
   -margcount -mc1 -mc2 -mnoargcount


GNU Tools   1993/10/13 3
GCC(1)   GNU Tools   GCC(1)


   AMD29K Options
   -m29000 -m29050 -mbw -mdw -mkernel-registers
   -mlarge -mnbw -mnodw -msmall -mstack-check
   -muser-registers

   M88K Options
   -m88000 -m88100 -m88110 -mbig-pic
   -mcheck-zero-division -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 Options
   -mfp-in-toc -mno-fop-in-toc

   RT Options
   -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 Options
   -mcpu=cpu type -mips2 -mips3 -mint64 -mlong64
   -mlonglong128 -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 Options
   -m486 -mno-486 -msoft-float -mno-fp-ret-in-387

   HPPA Options
   -mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs
   -mno-shared-libs -mlong-calls -mdisable-fpregs
   -mdisable-indexing -mtrailing-colon

   i960 Options
   -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 Options
   -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float

   System V Options


GNU Tools   1993/10/13 4
GCC(1)   GNU Tools   GCC(1)


   -G -Qy -Qn -YP,paths -Ym,dir

    Code Generation Options
   -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

OVERALL OPTIONS
    -x language
   Specify explicitly the language for the following
   input files (rather than choosing a default based
   on the file name suffix) . This option applies to
   all following input files until the next `-x' op-
   tion.  Possible  values of language are `c',
   `objective-c', `c-header', `c++',  `cpp-output',
   `assembler', and `assembler-with-cpp'.

    -x none
   Turn off any specification of a language, so that
   subsequent files are handled according to their
   file name suffixes (as they are if `-x' has not
   been used at all).

    If you want only some of the four stages (preprocess, com-
    pile, assemble, link), you can use `-x' (or filename suf-
    fixes) to tell gcc where to start, and one of the options
    `-c', `-S', or `-E' to say where gcc is to stop. Note
    that some combinations (for example, `-x cpp-output -E')
    instruct gcc to do nothing at all.

    -c   Compile or assemble the source files, but do not
   link. The compiler output is an object file corre-
   sponding to each source file.

   By default, GCC makes the object file name for a
   source file by replacing the suffix `.c', `.i',
   `.s', etc., with `.o'. Use -o to select another
   name.

   GCC ignores any unrecognized input files (those
   that do not require compilation or assembly) with
   the -c option.

    -S   Stop after the stage of compilation proper; do not
   assemble. The output is an assembler code file for
   each non-assembler input file specified.

   By default, GCC makes the assembler file name for a
   source file by replacing the suffix `.c', `.i',
   etc., with `.s'. Use -o to select another name.

GNU Tools   1993/10/13 5
GCC(1)   GNU Tools   GCC(1)


   GCC ignores any input files that don't require com-
   pilation.

    -E   Stop after the preprocessing stage; do not run the
   compiler proper. The output is preprocessed source
   code, which is sent to the standard output.

   GCC ignores input files which don't require prepro-
   cessing.

    -o file
   Place output in file file. This applies regardless
   to whatever sort of output GCC is producing,
   whether it be an executable file, an object file,
   an assembler file or preprocessed C code.

   Since only one output file can be specified, it
   does not make sense to use `-o' when compiling more
   than one input file, unless you are producing an
   executable file as output.

   If you do not specify `-o', the default is to put
   an executable file in `a.out', the object file for
   `source.suffix' in `source.o', its assembler file
   in `source.s', and all preprocessed C source on
   standard output.

    -v   Print (on standard error output) the commands exe-
   cuted to run the stages of compilation. Also print
   the version number of the compiler driver program
   and of the preprocessor and the compiler proper.

    -pipe Use pipes rather than temporary files for communi-
   cation between the various stages of compilation.
   This fails to work on some systems where the assem-
   bler cannot read from a pipe; but the GNU assembler
   has no trouble.


LANGUAGE OPTIONS
    The following options control the dialect of C that the
    compiler accepts:

    -ansi Support all ANSI standard C programs.

   This turns off certain features of GNU C that are
   incompatible with ANSI C, such as the asm, inline
   and typeof keywords, and predefined macros such as
   unix and vax that identify the type of system you
   are using. It also enables the undesirable and
   rarely used ANSI trigraph feature, and disallows
   `$' as part of identifiers.

   The alternate keywords __asm__,  __extension__,


GNU Tools   1993/10/13 6
GCC(1)   GNU Tools   GCC(1)


   __inline__ and __typeof__ continue to work despite
   `-ansi'. You would not want to use them in an ANSI
   C program, of course, but it is useful to put them
   in header files that might be included in compila-
   tions done with `-ansi'.  Alternate predefined
   macros such as __unix__ and __vax__ are also avail-
   able, with or without `-ansi'.

   The `-ansi' option does not cause non-ANSI programs
   to be rejected gratuitously. For that, `-pedantic'
   is required in addition to `-ansi'.

   The preprocessor predefines a macro __STRICT_ANSI__
   when you use the `-ansi' option. Some header files
   may notice this macro and refrain from declaring
   certain functions or defining certain macros that
   the ANSI standard doesn't call for; this is to
   avoid interfering with any programs that might use
   these names for other things.

    -fno-asm
   Do not recognize asm, inline or typeof as a key-
   word. These words may then be used as identifiers.
   You can use __asm__, __inline__ and __typeof__ in-
   stead. `-ansi' implies `-fno-asm'.

    -fno-builtin
   Don't recognize built-in functions that do not be-
   gin with two leading underscores. Currently, the
   functions affected include _exit, abort, abs, allo-
   ca, cos, exit, fabs, labs, memcmp, memcpy, sin,
   sqrt, strcmp, strcpy, and strlen.

   The `-ansi' option prevents alloca and _exit from
   being builtin functions.

    -fno-strict-prototype
   Treat a function declaration with no arguments,
   such as `int foo ();', as C would treat it--as say-
   ing nothing about the number of arguments or their
   types (C++ only). Normally, such a declaration in
   C++ means that the function foo takes no arguments.

    -trigraphs
   Support ANSI C trigraphs. The `-ansi' option im-
   plies `-trigraphs'.

    -traditional
   Attempt to support some aspects of traditional C
   compilers. For details, see the GNU C Manual; the
   duplicate list here has been deleted so that we
   won't get complaints when it is out of date.

   But one note about C++ programs only (not C).


GNU Tools   1993/10/13 7
GCC(1)   GNU Tools   GCC(1)


   `-traditional' has one additional effect for C++:
   assignment to this is permitted. This is the same
   as the effect of `-fthis-is-variable'.

    -traditional-cpp
   Attempt to support some aspects of traditional C
   preprocessors.  This includes the  items  that
   specifically mention the preprocessor above, but
   none of the other effects of `-traditional'.

    -fdollars-in-identifiers
   Permit the use of `$' in identifiers (C++ only).
   You can also use `-fno-dollars-in-identifiers' to
   explicitly prohibit use of `$'. (GNU C++ allows
   `$' by default on some target systems but not oth-
   ers.)

    -fenum-int-equiv
   Permit implicit conversion of int to enumeration
   types (C++ only). Normally GNU C++ allows conver-
   sion of enum to int, but not the other way around.

    -fexternal-templates
   Produce smaller code for template declarations, by
   generating only a single copy of each template
   function where it is defined (C++ only). To use
   this option successfully, you must also mark all
   files that use templates with either `#pragma
   implementation' (the  definition)  or `#pragma
   interface' (declarations).

   When   your code is compiled   with
   `-fexternal-templates', all template instantiations
   are external.  You must arrange for all necessary
   instantiations to appear in the implementation
   file; you can do this with a typedef that refer-
   ences each instantiation needed. Conversely, when
   you  compile using the default   option
   `-fno-external-templates', all template instantia-
   tions are explicitly internal.

    -fall-virtual
   Treat all possible member functions as virtual, im-
   plicitly. All member functions (except for con-
   structor functions and new or delete member opera-
   tors) are treated as virtual functions of the class
   where they appear.

   This does not mean that all calls to these member
   functions will be made through the internal table
   of virtual functions. Under some circumstances,
   the compiler can determine that a call to a given
   virtual function can be made directly; in these
   cases the calls are direct in any case.

没有评论: