GNU GCC 手册5

下面的`-m'选项用于HPPA族计算机:

-mpa-risc-1-0
生成 PA 1.0 处理器的目标码 .
-mpa-risc-1-1
生成 PA 1.1 处理器的目标码 .

 

-mkernel
生成适用于内核的目标码 . 特别要避免 add 指令 , 它有一个参数是 DP 寄存器 ; addil 代替 add 指令 . 这样可以避免 HP-UX 连接器的某个严重 bug.

 

-mshared-libs
生成能够连接 HP-UX 共享库的目标码 . 该选项还没有实现全部功能 , PA 目标默认为关闭 . 使用这个选项会导致 编译器生成错误的目标码 .

 

-mno-shared-libs
不生成连接 HP-UX 共享库的目标码 . 这是 PA 目标的默认选项 .

 

-mlong-calls
生成的目标码允许同一个源文件中的函数调用 , 调用点和被调函数的距离可以超过 256K 之远 . 不需要打开这个开关选项 , 除非连接器给出 ``branch out of range errors`` 这样的错误 .

 

-mdisable-fpregs
防止任何情况下使用浮点寄存器 . 编译内核需要这个选项 , 内核切换浮点寄存器的执行环境速度非常缓慢 . 如果打开了这个 开关选项同时试图浮点操作 , 编译将失败 .

 

-mdisable-indexing
防止编译器使用索引地址模式 (indexing address mode). 这样在 MACH 上编译 MIG 生成的代码时 , 可以 避免一些非常晦涩的问题 .

 

-mtrailing-colon
在标记定义 (label definition) 的末尾添加一个冒号 ( 用于 ELF 汇编器 ).

 

下面的`-m'选项用于Intel 80960族计算机:

-mcpu-type
默认机器类型为 cpu-type , 使编译器产生对应的指令 , 地址模式和内存对齐 . 默认的 cpu-type kb; 其他选择有 ka, mc, ca, cf, sa, sb.

 

-mnumerics
-msoft-float
-mnumerics 开关选项指出处理器不支持浮点指令 . -msoft-float 开关选项指出不应该认为 机器支持浮点操作 .

 

-mleaf-procedures
-mno-leaf-procedures
企图 ( 或防止 ) 改变叶过程 (leaf procedure), 使其可被 bal 指令以及 call 指令 调用 . 对于直接函数调用 , 如果 bal 指令能够被汇编器或连接器替换 , 这可以产生更有效的代码 , 但是其他情况下 产生较低效的代码 , 例如通过函数指针调用函数 , 或使用了不支持这种优化的连接器 .

 

-mtail-call
-mno-tail-call
执行 ( 或不执行 ) 更多的尝试 ( 除过编译器那些机器无关部分 ), 优化进入分支的尾递归 (tail-recursive) 调用 . 你 可能不需要这个 , 因为检测什么地方无效没有全部完成 . 默认开关是 -mno-tail-call.

 

-mcomplex-addr
-mno-complex-addr
认为 ( 或不认为 ) 在当前的 i960 设备上 , 值得使用复合地址模式 (complex addressing mode). 复合地址模式 可能不值得用到 K 系列 , 但是一定值得用在 C 系列 . 目前除了 CB CC 处理器 , 其他处理器上 -mcomplex-addr 是默认选项 .

 

-mcode-align
-mno-code-align
把目标码对齐到 8 字节边界上 ( 或者不必 ), 这样读取会快一些 . 目前只对 C 系列默认打开 .

 

-mic-compat
-mic2.0-compat
-mic3.0-compat
兼容 iC960 v2.0 v3.0.

 

-masm-compat
-mintel-asm
兼容 iC960 汇编器 .

 

-mstrict-align
-mno-strict-align
不允许 ( 或允许 ) 边界不对齐的访问 .

 

-mold-align
使结构对齐 (structure-alignment) 兼容 Intel gcc 发行版本 1.3 ( 基于 gcc 1.37). 目前 这个选项有点问题 , 因为 #pragma align 1 总是作同样的设定 , 而且无法关掉 .

 

下面的`-m'选项用于DEC Alpha设备:

-mno-soft-float
-msoft-float
使用 ( 或不使用 ) 硬件浮点指令进行浮点运算 . 打开 -msoft-float , 将使用 `libgcc1.c' 中的函数执行浮点运算 . 除非它们被仿真浮点操作的例程替换 , 或者类似 , 它们被编译为调用 仿真例程 , 这些例程将发出浮点操作 . 如果你为不带浮点操作的 Alpha 编译程序 , 你必须确保建立了这个库 , 以便不调用 仿真例程 .

注意,不带浮点操作的Alpha也要求拥有浮点寄存器.

 

-mfp-reg
-mno-fp-regs
生成使用 ( 或不使用 ) 浮点寄存器群的目标代码 . -mno-fp-regs 包含有 -msoft-float 开关选项 . 如果不使用浮点寄存器 , 浮点操作数就象整数一样通过整数寄存器传送 , 浮点运算结果放到 $0 而不是 $f0. 这是非标准 调用 , 因此任何带有浮点参数或返回值的函数 , 如果被 -mno-fp-regs 开关编译过的目标码调用 , 它也必须 用这个选项编译 .

这个选项的典型用法是建立内核,内核不使用任何浮点寄存器,因此没必要保存和恢复这些寄存器.

 

下面附加的选项出现在System V第四版中,用于兼容这些系统中的其他编译器:

-G
SVr4 系统中 , gcc 出于兼容接受了 `-G' 选项 ( 然后传递给连接器 ). 可是我们建议使用 `-symbolic' `-shared' 选项 , 而不在 gcc 命令行上出现连接选项 .

 

-Qy
验证编译器用的工具的版本 , 输出到 .ident 汇编指令 .

 

-Qn
制止输出端的 .ident 指令 ( 默认选项 ).

 

-YP,dirs
对于 `-l' 指定的库文件 , 只搜索 dirs. 你可以在 dirs 中用冒号隔开各个 目录项 .

 

-Ym,dir
dir 目录中寻找 M4 预处理器 . 汇编器使用这个选项 .

 

代码生成选项(CODE GENERATION OPTION)

下面的选项和平台无关 , 用于控制目标码生成的接口约定 .

大部分选项以`-f'开始.这些选项拥有确定和否定两种格式; `-ffoo'的否定格式是 `-fno-foo'.后面的描述将只列举其中的一个格式---非默认的格式.你可以通过添加或去掉 `no-'推测出另一个格式.

-fnonnull-objects
假设通过引用 (reference) 取得的对象不为 null ( C++).

一般说来, GNU C++对通过引用取得的对象作保守假设.例如,编译器一定会检查下似代码中的a不为 null:

obj &a = g (); a.f (2);

检查类似的引用需要额外的代码,然而对于很多程序是不必要的.如果你的程序不要求这种检查,你可以用 `-fnonnull-objects'选项忽略它.

 

-fpcc-struct-return
函数返回 struct union 值时 , 采用和本地编译器相同的参数约定 . 对于较小的结构 , 这种约定的效率偏低 , 而且很多机器上不能重入 ; 它的优点是允许 GCC 编译的目标码和 PCC 编译的目标码互相调用 .

 

-freg-struct-return
一有可能就通过寄存器返回 struct union 函数值 . 对于较小的结构 , 它比 -fpcc-struct-return 更有效率 .

如果既没有指定-fpcc-struct-return ,也没有指定-freg-struct-return, GNU CC默认使用目标机的标准约定.如果没有标准约定, GNU CC默认采用-fpcc-struct-return.

 

-fshort-enums
enum 类型只分配它声明的值域范围的字节数 . 就是说 , enum 类型等于大小足够的 最小整数类型 .

 

-fshort-double
使 double 类型的大小和 float 一样 .

 

-fshared-data
要求编译结果的数据和非 const 变量是共享数据 , 而不是私有数据 . 这种差别仅在某些操作系统上面有意义 , 那里的共享数据在同一个程序的若干进程间共享 , 而私有数据在每个进程内都有副件 .

 

-fno-common
即使未初始化的全局变量也分配在目标文件的 bss , 而不是把它们当做普通块 (common block) 建立 . 这样的 结果是 , 如果在两个不同的编译结果中声明了同一个变量 ( 没使用 extern ), 连接它们时会产生错误 . 这个选项可能有用的唯一情况是 , 你希望确认程序能在其他系统上运行 , 而其他系统总是这么做 .

 

-fno-ident
忽略 `#ident' 指令 .

 

-fno-gnu-linker
不要把全局初始化部件 ( C++ 的构造子和解构子 ) 输出为 GNU 连接器使用的格式 ( GNU 连接器是标准方法的系统 上 ). 当你打算使用非 GNU 连接器的时候可以用这个选项 , GNU 连接器也需要 collect2 程序确保系统连接器 放入构造子 (constructor) 和解构子 (destructor). (GNU CC 的发布包中包含有 collect2 程序 .) 对于必须使用 collect2 的系统 , 编译器驱动程序 gcc 自动配置为这么做 .

 

-finhibit-size-directive
不要输出 .size 汇编指令 , 或其他类似指令 , 当某个函数一分为二 , 两部分在内存中距离很远时会引起问题 . 当编译 `crtstuff.c' 时需要这个选项 ; 其他情况下都不应该使用 .

 

-fverbose-asm
输出汇编代码时放些额外的注释信息 . 这个选项仅用于确实需要阅读汇编输出的时候 ( 可能调试编译器自己的时候 ).

 

-fvolatile
使编译器认为所有通过指针访问的内存是易变内存 (volatile).

 

-fvolatile-global
使编译器认为所有的外部和全局变量是易变内存 .

 

-fpic
如果支持这种目标机 , 编译器就生成位置无关目标码 . 适用于共享库 (shared library).

 

-fPIC
如果支持这种目标机 , 编译器就输出位置无关目标码 . 适用于动态连接 (dynamic linking), 即使分支需要大范围 转移 .

 

-ffixed-reg
把名为 reg 的寄存器按固定寄存器看待 (fixed register); 生成的目标码不应该引用它 ( 除了或许 用作栈指针 , 帧指针 , 或其他固定的角色 ).

reg必须是寄存器的名字.寄存器名字取决于机器,用机器描述宏文件的REGISTER_NAMES宏 定义.

这个选项没有否定格式,因为它列出三路选择.

 

-fcall-used-reg
把名为 reg 的寄存器按可分配寄存器看待 , 不能在函数调用间使用 . 可以临时使用或当做变量使用 , 生存期 不超过一个函数 . 这样编译的函数无需保存和恢复 reg 寄存器 .

如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.

这个选项没有否定格式,因为它列出三路选择.

 

-fcall-saved-reg
把名为 reg 的寄存器按函数保护的可分配寄存器看待 . 可以临时使用或当做变量使用 , 它甚至能在函数间 生存 . 这样编译的函数会保存和恢复使用中的 reg 寄存器 .

如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.

另一种灾难是用这个选项说明的寄存器返回函数值.

这个选项没有否定格式,因为它列出三路选择.

 

PRAGMAS

GNU C++ 支持两条 `#pragma' 指令使同一个头文件有两个用途 : 对象类的接口定义 , 对象类完整的内容定义 .
#pragma interface
( 仅对 C++) 在定义对象类的头文件中 , 使用这个指令可以节省大部分采用该类的目标文件的大小 . 一般说来 , 某些信息 ( 内嵌成员函数的备份副件 , 调试信息 , 实现虚函数的内部表格等 ) 的本地副件必须保存在包含类定义的各个目标文件中 . 使用这个 pragma 指令能够避免这样的复制 . 当编译中引用包含 `#pragma interface' 指令的头文件时 , 就 不会产生这些辅助信息 ( 除非输入的主文件使用了 `#pragma implementation' 指令 ). 作为替代 , 目标文件 将包含可被连接时解析的引用 (reference).

 

#pragma implementation
#pragma implementation "objects.h"
( 仅对 C++) 如果要求从头文件产生完整的输出 ( 并且全局可见 ), 你应该在主输入文件中使用这条 pragma. 头文件 中应该依次使用 `#pragma interface' 指令 . implementation 文件中将产生全部内嵌成员函数 的备份 , 调试信息 , 实现虚函数的内部表格等 .

如果`#pragma implementation'不带参数,它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc', `#pragma implementation'等于`#pragma implementation allclass.h'.如果某个implementation文件需要从多个头文件引入代码,就应该 使用这个字符串参数.

不可能把一个头文件里面的内容分割到多个implementation文件中.

 

文件(FILE)

file.c             C源文件
file.h             C头文件(预处理文件)
file.i            预处理后的C源文件
file.C             C++源文件
file.cc            C++源文件
file.cxx           C++源文件
file.m             Objective-C源文件
file.s            汇编语言文件
file.o            目标文件
a.out             连接的输出文件
TMPDIR/cc*        临时文件
LIBDIR/cpp        预处理器
LIBDIR/cc1         C编译器
LIBDIR/cc1plus     C++编译器
LIBDIR/collect    某些机器需要的连接器前端(front end)程序
LIBDIR/libgcc.a    GCC子例程(subroutine)/lib/crt[01n].o   启动例程(start-up)
LIBDIR/ccrt0       C++的附加启动例程
/lib/libc.a       标准C,另见intro (3)
/usr/include       #include文件的标准目录
LIBDIR/include     #include文件的标准gcc目录
LIBDIR/g++-include #include文件的附加g++目录
LIBDIR 通常为 /usr/local/lib/machine/version.
TMPDIR
来自环境变量 TMPDIR ( 如果存在 , 缺省为 /usr/tmp , 否则为 /tmp).

BUGS

关于报告差错的指导请查阅 GCC 手册 .

版权(COPYING)

Copyright 1991, 1992, 1993 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies o

你可能感兴趣的:(C++,c,C#,gcc,HP)