GNU GCC 手册(5)

 

 

GCC 5

Section: GNU Tools (1)
Updated: 2003/12/05
Sponsor: GCC Casino Winning Content


 

下面的`-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 of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.

 

作者(AUTHORS)

关于GNU CC的奉献者请查阅GUN CC手册.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以通过以下几种方式下载GNU GCC的中文手册: 1. 官方网站下载:你可以访问GNU GCC的官方网站(https://gcc.gnu.org/)并查找相关的文档下载页面。有时候,官方网站会提供中文手册的下载链接或者提供其他语言的手册,并且通常会有最新的更新。你可以在官方网站上搜索相关的链接,然后根据指引下载中文手册。 2. 在线文档查找:一些编程类的网站提供了各种编程语言的中文手册。你可以通过搜索引擎搜索“GNU GCC中文手册”或者“GCC中文文档”,然后查找可靠的网站,比如CSDN、简书、GitHub等。这些网站通常会有编程相关的教程、手册以及技术文档,其中可能也包括GNU GCC的中文手册。 3. 社区论坛下载:在编程社区或者论坛中,有很多热心的开发者会分享自己整理或者翻译的编程手册和教程。你可以加入这些社区或论坛,并在对应的板块或下载区寻找GCC的中文手册。在这些平台上,你也可以提问,向其他开发者寻求帮助。 需要注意的是,GNU GCC是一个开源项目,并且有众多的贡献者参与其中,因此可能存在多个版本的中文手册。在下载之前,最好确认手册的版本与你使用的GCC版本相对应,以获得最准确和最合适的信息。如果有需要,你也可以查阅英文的GCC手册,因为英文手册通常会比中文手册更为详细和全面。 ### 回答2: 在GNU GCC (GNU Compiler Collection)的官方网站上,您可以找到关于中文手册的下载链接。下面是一些下载中文手册的途径: 1. GNU GCC官方网站: 您可以访问www.gnu.org/software/gcc获取最新版本的GNU GCC软件以及相关的中文文档。在该网站,您可以找到GCC手册的在线版本,也可以下载PDF版本的手册。 2. GNU镜像站点: GNU GCC的中文手册也可以在GNU镜像站点下载。GNU镜像站点位于不同的地理位置,并提供了大量的GNU软件和文档的下载。您可以在线搜索并访问适合您的镜像站点,然后浏览GNU GCC的文件夹,找到中文手册的下载链接。 3. 在线文档: 除了下载中文手册,您还可以通过在线文档来学习和使用GNU GCC。在GNU GCC官方网站上,您可以找到HTML格式的在线文档,其中包括GCC的功能、命令和选项的详细说明。 请注意,GNU GCC是一套强大而复杂的编译器工具集,手册中提供了广泛的信息和使用指南,包括编译器的命令行选项、语法规则和示例。使用手册时,请根据您的需求和经验水平选择适合的章节和内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值