gcc流程及鲜有人知的参数

基本概念

1、预处理:  gcc -E project.c -o project.i     //生成预处理文件    project.i 宏展开 包含展开
2、编译:    gcc -S project.i -o project.S     //生成汇编文件      project.S 高级语言转成低级语言
3、汇编:    gcc -c project.S -o project.o     //生成机器语言      project.o 生成未地址定位的机器码
4、链接:    gcc project.o    -o project        //生成可运行程序   project 加载库文件

5、-l和-L参数,libtest.so 则参数-ltest (这个参数的库名称推导是gcc自动干的)
-I:指定第一个寻找头文件的目录
-L:指定第一个寻找库文件的目录
-l:表示在库文件目录中寻找指定的动态库文件
-Bprefix  prefix是文件输出目录
-Idir 等同于 -I-
-Ldir 库文件路径

如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到之指定库,
而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

静态库文件.a和动态库文件.so
冷载:静态库.a文件,需要编译把库文件编译到可执行程序中去
热载:动态库.so文件,不需要把库文件编译到可执行程序中,而是通过入口地址外部引用的方式进行调用。
也正是有着不同的性质,通常链接静态库的生成的可执行程序较大,而动态库文件较小。
在分工合作的大型项目中动态库显得尤为重要,虽然我们很少归档成动态库文件进行调用,
作为一个优秀的程序员,这种东西还是要求能够掌握的。

动态库可应用在C++插件方向(人们常说的面向接口编程)

文件(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/ccl                      C 编译器 
LIBDIR/cclplus               C++编译器 
LIBDIR/collect                 某些机器需要的连接器前端(front end)程序
LIBDIR/libgcc.a               GCC 子例程(subroutine)库
/lib/crt[01n].o                   启动例程(start-up) 
LIBDIR/ccrt0                   C++的附加启动例程
/lib/libc.a                         标准 C 库
/usr/include                     #include 文件的标准目录
LIBDIR/include               #include 文件的标准 gcc 目录
LIBDIR/g++-include        #include 文件的附加 g++目录

在win体系下 存在cl  CPP和C用同一个编译器

调试选项

-dletters
                          编译的时候,在letters指定的时刻做调试转储(dump).
                          用于调试编译器.大多数转储的文件名通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').

-fpretend-float 

-g                      生成代码支持GDB调试参数

-glevel    

-gcoff                 以COFF格式(如果支持)输出调试信息.这是在System V第四版以前的大多数System V系统上SDB使用的格式. 

-gxcoff               以XCOFF格式(如果支持)输出调试信息.这是 IBM RS/6000 系统上 DBX 调试器使用的格式

-gxcoff+             以XCOFF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.
                          使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.

-gdwarf              以DWARF格式(如果支持)输出调试信息.这是大多数 System V 第四版系统上SDB使用的格式

-gdwarf+             

                           以DWARF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理
                           解的GNU扩展.使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序. 

-gstabs               以stabs格式(如果支持)输出调试信息,不包括GDB扩展.这是大多数BSD系统上DBX使用的格式

-gstabs+              
                            以stabs格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.
                            使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序. 

-ggdb                   以本地格式(如果支持)输出调试信息,尽可能包括 GDB 扩展. 

-a                         
                            产生额外代码,用于输出基本块(basic block)的 profile 信息,它记录各个基本块的执行次数,
                             供诸如 tcov 此类的程序分析.但是注意,这个数据格式并非 tcov 期待的.最终 GNU gprof 将处理这些数据.

-p                          产生额外代码,用于输出 profile 信息,供分析程序 prof 使用

-pg                        产生额外代码,用于输出 profile 信息,供分析程序 gprof 使用

-save-temps              保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.
                                  因此,用`-c -save-temps' 选项编译 `foo.c ' 会生成 ` foo.cpp' 和 `foo.s' 以 及`foo.o'文件.

-print-file-name=library
                                           显示库文件 library 的全路径名,连接时会使用这个库---其他什么事情都不作.
                                           根据这个选项, GNU CC 既不编译,也不连接,仅仅显示文件名. 

-print-libgcc-file-name         和`-print-file-name=library'一样. 

-print-prog-name=program 类似于`-print-file-name',但是查找程序 program 如`cpp'.


优化选项

-fcaller-saves    
                                 允许在寄存器里分配数值,但是这个方案通常受到各个函数调用的冲击,
                                 因此 GCC 生成额外的代码,在函数调用的前后保存和复原寄存器内容.
                                 仅当生成代码看上去优于反之结果时才实现这样的分配.
                                 某些机器上该选项默认为允许,通常这些机器没有调用保护寄存器代替使用. 
 

-fcse-follow-jumps
                                  在公共子表达式消元(common subexpression elimination)的时候,如果没有其他路径
                                  到达某个跳转的目的地,就扫过这条 jump 指令.
                                  例如,如果 CSE 遇到带有 else从句的 if 语句,当条件测试为 false 时, CSE 就跟在 jump 后面. 
 

-fcse-skip-blocks       它类似于`-fcse-follow-jumps'选项,但是 CSE 跟在条件跳转后面,条件跳转跳过了语句块(block).
                                  如果 CSE 遇到一条简单的 if 语句,不带 else 从句, `-fcse-skip-blocks'选项将
                                  导致 CSE 跟在 if 产生的跳转后面. 
 

-fdelayed-branch       如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed branch)指令后面的指令空隙
 

-felide-constructors  
                               如果看上去合理就省略构造子(仅 C++).
                               根据这个选项,对于下面的代码, GNU C++直接从调用 foo 初始化 y,而无需通过临时变量: 
                                                                     A foo ();
                                                                     A y = foo (); 
                                如果没有这个选项, GNU C++首先通过调用类型 A 合适的构造子初始化 y;
                                然后把 foo的结果赋给临时变量;最后,用临时变量替换`y'的初始值. 
                                ANSI C++标准草案规定了默认行为(`-fno-elide-constructors').
                                如果程序的构造子存在 副效应, `-felide-constructors'选项能够使程序有不同的表现,
                                因为可能忽略一些构造子的调用. 
 

-fexpensive-optimizations 执行一些相对开销较大的次要优化.

-ffast-math  
                                这个选项出于速度优化,允许 GCC 违反某些 ANSI 或 IEEE 规则/规格.
                                例如,它允许编译器假设 sqrt 函数的参数是非负数. 这个选项不被
                                任何`-O'选项打开,因为对于严格依靠IEEE或ANSI规则/规格实现的数学函数,程序可能会产生错误的结果. 

-ffloat-store
                                不要在寄存器中存放浮点变量. 这样可以防止某些机器上不希望的过高精度,
                                如 68000 的浮点寄存器(来自 68881)保存的精度超过了 double 应该具有的精度. 
                                对于大多数程序,过高精度只有好处.但是有些程序严格依赖于 IEEE 浮点数的定义.
                                对这样的程序可以使用 `-ffloat-store'选项. 

-fforce-addr             做数学运算前把将要使用的内存地址常数送入寄存器.它可能和`-fforce-mem'一样产生较好的目标码.
 

-fforce-mem        
                                做数学运算前把将要使用的内存操作数送入寄存器.通过把内存访问转换成潜在的公共子表达式,
                                它可能产生较好的目标码. 如果它们不是公共子表达式,指令组合应该消除各自的寄存器载荷. 

-finline-functions
                                把所有简单的函数集成进调用者.编译器探索式地决定哪些函数足够简单,值得这种集成.
                                如果集成了所有给定函数的调用,而且函数声明为 static,那么一般说来 GCC 有权不按汇编代码输出函数

-fkeep-inline-functions
                                即使集成了某个函数的所有调用,而且该函数声明为static,
                                仍然输出这个函数一个独立的,运行时可调用的版本. 

-fmemoize-lookups 

-fno-default-inline    禁止默认的内嵌(内联)函数,因为它们定义在类的作用域内(仅 C++).

-fno-inline                禁止内嵌(内联函数),定义在类的作用域内(C++)

-fno-defer-pop         一旦函数返回,参数就立即弹出.对于那些调用函数后必须弹出参数的机器,
                               编译器一般情况下让几次函数调用的参数堆积在栈上,然后一次全部弹出. 

-fno-function-cse   
                               不要把函数地址存入寄存器;让调用固定函数的指令显式给出函数地址.
                               这个选项产生效率较低的目标码,但是如果不用这个选项,某些不寻常的 hack,
                               改变汇编器的输出,可能因优化而带来困惑. 

-fno-peephole         禁止任何机器相关的 peephole 优化. 

-fomit-frame-pointer 
                               对于不需要帧指针(frame pointer)的函数,不要在寄存器中保存帧指针.
                               这样能够避免保存,设置和恢复 帧指针的指令;同时对许多函数提供一个额外的寄存器.
                               但是在大多数机器上将无法调试. 某些机器上,如 Vax,这个选项无效,
                               因为标准调用序列自动处理帧指针,通过假装不存在而不保存任何东西.
                               机器描述宏 FRAME_POINTER_REQUIRED 控制目标机是否支持这个选项. 

-frerun-cse-after-loop 执行循环优化后,重新进行公共子表达式消元.

-fschedule-insns      
                                 如果对目标机支持这个功能,它试图重新排列指令,以便消除因数据未绪造成的执行停顿.
                                 这可以帮助浮点运算或内存访问 较慢的机器调取指令,
                                 允许其他指令先执行,直到调取指令或浮点运算完成

-fschedule-insns2     类似于`-fschedule-insns'选项,但是在寄存器分配完成后,需要一个额外的指令调度过程.
                                 对于 寄存器数目相对较少,而且取内存指令大于一个周期的机器,这个选项特别有用.

-fstrength-reduce     执行循环强度缩小(loop strength reduction)优化,并且消除重复变量. 

-fthread-jumps          执行优化的地点是,如果某个跳转分支的目的地存在另一个条件比较,
                                 而且该条件比较包含在前一个比较语句之内,那么执行优化.
                                 根据条件是 true 或者 false,前面那条分支重定向到第二条分支的目的地或者紧跟在第二条分支后面. 

-funroll-all-loops        执行循环展开(loop unrolling)优化.对所有循环实行.通常使程序运行的更慢. 

-funroll-loops             执行循环展开(loop unrolling)优化.仅对循环次数能够在编译时或运行时确定的循环实行. 
 

-O 优化的Option
-O0          不优化. 如果指定了多个-O 选项,不管带不带数字,最后一个选项才是生效的选项
-O1          优化.对于大函数,优化编译占用稍微多的时间和相当大的内存.
-O2          多优化一些.除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作.
-O3          优化的更多.除了打开-O2 所做的一切,它还打开了-finline-functions 选项.

不使用`-O'选项时,只有声明了 register 的变量才分配使用寄存器.编译结果比不用 
`-O'选项的 PCC 要略逊一筹

使用了`-O'选项,编译器会试图减少目标码的大小和执行时间。-O 选项可能会有连锁的选项打开:
delay slot 的机器上`-fthread-jumps'和`-fdefer-pop',`-fdelayed-branch'选项将被打开.
在即使没有帧指针 (frame pointer)也支持调试的机器上, `-fomit-frame-pointer'选项将被打开.某些机器上还可能会打开其他选项. 
 

警告选项

-fsyntax-only          只打开语法错误,不产生输出信息

-pedantic                打开完全服从 ANSI C 标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.

-pedantic-errors     该选项和`-pedantic'类似,但是显示错误而不是警告.

-w                           禁止所有警告信息. 

-W                          非易变自动变量(nonvolatile automatic variable)可能在调用 longjmp 时发生改变.
                               这些警告仅在优化编译时发生. 

-Wall                       结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,
                               我们相信,恰当结合宏的使用能够 轻易避免这些用法。
                               剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被
                               编译器警告的程序结构,可以合理的用在"干净的"程序中. 

-Waggregate-return
                               如果定义或调用了返回结构或联合的函数,编译器就发出警告.
                               (从语言角度你可以返回一个数组,然而同样会 导致警告.) 

-Wcast-align      
                               一旦某个指针类型强制转换时,导致目标所需的地址对齐(alignment)增加,编译器就发出警告.
                               例如,某些机器上 只能在 2 或 4 字节边界上访问整数,如果在这种机型上把char *强制转
                               换成 int *类型, 编译器就发出警告. 

-Wcast-qual            一旦某个指针强制类型转换以便移除类型修饰符时,编译器就发出警告.
                               例如,如果把 const char * 强制转换为普通的 char *时,警告就会出现.

-Wchar-subscript   警告类型是 char 的数组下标.这是常见错误,程序员经常忘记在某些机器上 char 有符号. 

-Wcomment           如果注释起始序列`/*'出现在注释中,编译器就发出警告

-Wconversion      
                               如果某函数原形导致的类型转换和无函数原形时的类型转换不同,编译器就发出警告.
                               这里包括定点数和浮点数的互相转换,改变定点数的宽度或符号,除非他们和缺省声明(default promotion)相同. 

-Wenum-clash        对于不同枚举类型之间的转换发出警告(仅适用于 C++).

-Werror                   视警告为错误;出现任何警告即放弃编译.

-Wformat                检查对 printf 和 scanf 等函数的调用,确认各个参数类型和格式串中的一致

-Wid-clash-len       
                               一旦两个确定的标识符具有相同的前 len 个字符,编译器就发出警告.
                               他可以协助你开发一些将要在某些 过时的,危害大脑的编译器上编译的程序

-Wimplicit                警告没有指定类型的声明和声明之前就使用的函数

-Wimplicit-int           警告没有指定类型的声明

-Wimplicit-function-declaration          警告在声明之前就使用的函数

-Winline                   如果某函数不能内嵌 (inline), 无论是声明为 inline 或者是指定了-finline-functions 选项,编译器都将发出警告. 

-Wlong-long            如果使用了 long long 类型就发出警告.该警告是缺省项.
                               使用`-Wno-long-long' 选项能够防止这个警告 .
                                `-Wlong-long' 和 `-Wno-long-long' 仅在`-pedantic'之下才起作用. 
-Wmain               
                               如果把 main 函数声明或定义成奇怪的类型,编译器就发出警告.
                               典型情况下,这个函数用于外部连接, 返回 int 数值,不需要参数,或指定两个参数.

-Wmissing-prototypes
                               如果没有预先声明函数原形就定义了全局函数,编译器就发出警告.
                               即使函数定义自身提供了函数原形也会产生这个警告. 他的目的是检查没有在头文件中声明的全局函数.

-Wmissing-declarations
                               如果没有预先声明就定义了全局函数,编译器就发出警告.
                               即使函数定义自身提供了函数原形也会产生这个警告.
                               这个选项 的目的是检查没有在头文件中声明的全局函数.

-Wnested-externs   如果某 extern 声明出现在函数内部,编译器就发出警告. 

-Wno-import            禁止所有关于#import 的警告信息.

-Wparentheses       在某些情况下如果忽略了括号,编译器就发出警告. 

-Wpointer-arith        
                                任何语句如果依赖于函数类型的大小(size)或者void类型的大小,编译器就发出警告.
                                GNU C 为了 便于计算 void *指针和函数指针,就把这些类型的大小定义为 1. 

-Wredundant-decls      如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别. 

-Wreturn-type
                                如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.
                                同时警告那些不带返回值的 return 语句,如果他们所属的函数并非 void 类型. 

-Wshadow                一旦某个局部变量屏蔽了另一个局部变量,编译器就发出警告

-Wstrict-prototypes
                                如果函数的声明或定义没有指出参数类型,编译器就发出警告.
                                (如果函数的前向引用说明指出了参数类型,则允许后面使用旧式风格的函数定义,而不会产生警告.) 

-Wswitch
                                如果某条 switch 语句的参数属于枚举类型,但是没有对应的 case 语句使用枚举元素,编译器 就发出警告.
                                ( default 语句的出现能够防止这个警告.)超出枚举范围的case 语句同样会 导致这个警告. 

-Wtemplate-debugging
                                当在 C++程序中使用 template 的时候,如果调试(debugging)没有完全生效,编译器就发出警告.
                                (仅用于 C++). 

-Wtraditional          
                                 如果某些程序结构在传统 C 中的表现和 ANSI C 不同,编译器就发出警告.
                               (宏参出现在宏体的字符串常量内部.传统 C 会替换宏参,而 ANSI C 则视其为常量的一部分.
                                某个函数在块(block)中声明为外部,但在块结束后才调用. switch 语句的操作数类型是 long.)

-Wtrigraphs              警告任何出现的 trigraph (假设允许使用他们). 

-Wuninitialized         在初始化之前就使用自动变量.

-Wunused                如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,
                                或者某条语句的运算结果显然没有使用, 编译器就发出警告. 

-Wwrite-strings        规定字符串常量的类型是 const char[length],因此,把这样的地址复制给non-const char *指针将产生警告预处理选项

-Aquestion(answer)
                                如果预处理器做条件测试,如`#if #question(answer)',
                                该选项可以断言(Assert) question 的答案是 answer.
                                -A-'关闭一般用于描述目标机的标准断言. 

-C                          告诉预处理器不要丢弃注释.配合`-E'选项使用.

-dD                       告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示. 

-dM                       告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E'选项使用.

-dN                       和`-dD'选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.

-Dmacro[=defn]    定义宏 macro 的内容为 defn.命令行上所有的`-D'选项在 `-U'选项之前处理.

-E                         仅运行 C 预处理器.预处理所有指定的 C 源文件,结果送往标准输出或指定的输出文件

-H                         除了其他普通的操作, GCC 显示引用过的头文件名

-idirafter dir
                            把目录 dir 添加到第二包含路径中.
                            如果某个头文件在主包含路径(用`-I'添加的路径)中没有找到,预处理器就搜索第二包含路径. 

-include file          
                            在处理常规输入文件之前,首先处理文件 file,其结果是,文件 file 的内容先得到编译. 
                            命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令行上的顺序如何.
                            然而`-include'和`-imacros'选项按书写顺序处理.

-imacros file    
                            在处理常规输入文件之前,首先处理文件 file,但是忽略输出结果.
                            由于丢弃了文件file的输出内容, `-imacros file'选项的唯一效果就是使文件 file 中的宏定义生效, 
                            可以用于其他输入文件.

-iprefix file            指定 prefix 作为后续`-iwithprefix'选项的前缀. 

-iwithprefix dir      把目录添加到第二包含路径中.目录名由 prefix 和 dir 合并而成,这里 prefix 被先前的`-iprefix'选项指定. 

-M                        告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,
                            预处理器输出 一个 make 规则,该规则的目标项(target)是源文件对应的目标文件名,
                            依赖项(dependency)是源文件中 `#include 引用的所有文件.生成的规则可以是单行,
                            但如果太长,就用`\'-换行符续成多行.规则显示在标准输出,不产生预处理过的 C 程序.

-MD                     和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o'替换为 `.d'产生.
                            同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常的编译任务. 
                            Mach 的实用工具`md'能够合并`.d'文件,产生适用于`make'命令的单一的 依赖文件. 

-MM           和`-M'选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"'.忽略系统头文件如`#include <file>'.

-MMD        和`-MD'选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.

-nostdinc   不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适). 

-P              告诉预处理器不要产生`#line'命令.配合`-E'选项使用.

-Umacro    取消宏 macro. `-U'选项在所有的`-D'选项之后处理,但是优先于任何 `-include'或`-imacros'选项. 

-undef        不要预定义任何非标准宏. (包括系统结构标志). 

 

连接器选项

-llibrary         链接库文件-ltest类似参数

-nostartfiles  不连接系统标准启动文件,而标准库文件仍然正常使用

-nostdlib       不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器

-static           在支持动态链接的系统上,阻止链接共享库。该选项在其他系统上无效

-shared         生成一个共享目标文件,他可以和其他目标文件链接产生可执行文件.只有部分系统支持该选项

-symbolic    
                     建立共享目标文件的时候,把引用绑定到全局符号上.
                     对所有无法解析的应用做出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs'取代).只有部分系统支持该选项.

-Xlinker option
                     把选项 option 传递给连接器.
                     可以用他传递系统特定的连接选项, GNU CC 无法识别这些选项.

-u symbol      
                     使连接器认为取消了 symbol 的符号定义,从而连接库模块以取得定义.
                     你可以使用多个 `-u'选项,各自跟上不同的符号,使得连接器调入附加的库模块. 

-Wl,option     把选项 option 传递给连接器.如果 option 含有逗号,就在逗号处分割成多个选项. 

 

汇编器选项

-Wa,option    把选项 option 传递给汇编器.如果 option 含有逗号,就在逗号处分割成多个选项. 

 

代码生成选项


-fcall-saved-reg  
                     把名为 reg 的寄存器按函数保护的可分配寄存器看待.
                     可以临时使用或当做变量使用,它甚至能在函数间生存.这样编译的函数会保存和恢复使用中的 reg 寄存器.
                     如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针. 
                     另一种灾难是用这个选项说明的寄存器返回函数值. 
                     这个选项没有否定格式,因为它列出三路选择. 
                  
-fcall-used-reg  
                     把名为 reg 的寄存器按可分配寄存器看待,不能在函数调用间使用.
                     可以临时使用或当做变量使用,生存期不超过一个函数.
                     这样编译的函数无需保存和恢复 reg 寄存器.
                     如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针. 
                     这个选项没有否定格式,因为它列出三路选择.

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

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

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

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

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

-fno-gnu-linker         不要把全局初始化部件(如 C++的构造子和解构子)输出为 GNU 连接器使用的格式(在GNU 连接器是标准方法的系统上).

-fpcc-struct-return     函数返回struct和union值时,采用和本地编译器相同的参数约定.

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

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

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

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

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

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

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

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

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

 

目录选项

-Bprefix 
-Idir 
-I- 
-Ldir

 

目标机信息查看

-b machine 
-V version

 

配置相关选项(cpu、指令集、二进制文件排列选择)

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-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 选项
-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


 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值