目录
常用选项
全局选项
头文件选项
链接选项
LDFLAGS
依赖选项
调试选项
警告选项
优化选项
代码生成选项
标准及语言选项
机器依赖选项
传递给汇编器的选项
仅可用于 CFLAGS 的选项
仅可用于 CXXFLAGS 的选项
系统环境变量
常用选项
常用选项
含义
-o
指定输出文件名为file,这个名称不能跟源文件名同名。(若直接gcc hello.c则会产生a.out)
-E
只预处理,不编译、汇编、链接。 //用到arm-linux-cpp,一般输出 .i 文件
例: gcc -E hello.c > pianoapan.txt
-S
只预处理和编译,不汇编、链接,生成汇编代码(.s)。 //用到cc1 (就是cc1,不是arm-linux-cc1),
例: gcc -S hello.c //将生成.s的汇编代码,您能够用文本编辑器查看
-c
预处理、编译和汇编,不链接,生成ELF目标文件(.o文件)(OBJ文件) //用到arm-linux-as
例: gcc -c hello.c //将生成.o的obj文档
--version
显示 gcc 版本号和版权信息 。
-v
显示制作GCC工具时自身的配置(路径、选项等);同时显示编译器驱动程序、预处理器 、编译器的版本号
--help
--target-help显示 gcc 帮助说明。‘--target-help’是显示目标机器特定的命令行选项。
1. 编译过程中,除非使用-E、-S、-c选项(或编译出错阻止了完整的编译过程),否则最后的步骤都是链接。
2. 预处理、编译、汇编、连接所做的事情,详见《嵌入式Linux嵌入式开发完全手册.pdf》
3. 预处理、编译、汇编这三步,一般统称为编译
4. 一般用 gcc -c -o a.o a.c; gcc -c -o b.o b.c,最后用 ld -o test a.o b.o来生成可执行程序。(gcc -o test a.o b.o也可以。前边做了编译,所以此步只会连接)全局选项
全局选项
含义
-Dmacro
相当于C语言中的#define macro 。其默认为:#define macro 1
-Dmacro=defn
相当于C语言中的#define macro defn 。例:-DPI=3.14 即:#define PI 3.14
-Umacro
相当于C语言中的#undef macro
-undef
取消对任何非标准宏的定义
-x language filename
设定文档所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或.cpp。例:假如C代码文档的后缀名是.pig 哈哈,那您就要用这个参数,这个参数对他后面的文档名都起作用,除非到了下一个参数的使用。
能够使用的参数有下面的这些
`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'.
例: gcc -x c hello.pig
-x none filename
关掉上一个选项,也就是让gcc根据文档名后缀,自动识别文档类型
例: gcc -x c hello.pig -x none hello2.c
-pipe
在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。
gcc -pipe -o hello.exe hello.c
-fno-strict-prototype
只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数。
而gcc无论是否使用这个参数,都将对没有带参数的函数,认为是没有显式说明的类型
-fthis-is-varialble
就是向传统c++看齐,能够使用this当一般变量使用.
-fcond-mismatch
允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进行配置,决定将char类型配置成unsigned char(前两个参数)或 signed char(后两个参数)
-imacros file
将file文档的宏,扩展到gcc/g++的输入文档,宏定义本身并不出现在输入文档中
-C
告诉预处理器不要丢弃注释。配合`-E'选项使用。
-P
告诉预处理器不要产生`#line'命令。配合`-E'选项使用。
头文件选项
头文件选项
含义
-I dir
把dir加到头文件的搜索路径中,而且gcc会在搜索标准头文件之前先搜索dir。一般直接写绝对
路径。如果头文件的路径在本.c文件同级目录下,可用-I . 。
#include "c.h"先在同级目录搜索,#include 尖括号 先去-I指定的路径以及编译器路径搜索。
-I-
取消前一个参数的功能,所以一般在-Idir之后使用
-idirafter dir
在-I的目录里面查找失败,将到这个目录里面查找
-iprefix prefix
-iwithprefix dir
一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
-nostdinc
使编译器不再系统缺省的头文档目录里面找头文档,一般和-I联合使用,明确限定头文档的位置
-nostdin C++
规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库使用
--sysroot=dir
将dir作为逻辑根目录。比如编译器通常会在 /usr/include 和 /usr/lib 中搜索头文件和库,使用这个选项后将在 dir/usr/include 和 dir/usr/lib 目录中搜索。如果使用这个选项的同时又使用了 -isysroot 选项,则此选项仅作用于库文件的搜索路径,而 -isysroot 选项将作用于头文件的搜索路径。这个选项与优化无关,但是在 CLFS 中有着神奇的作用。
-include file
包含某个代码,简单来说,就是便以某个文档,需要另一个文档的时候,就能够用他设定,功能就相当于在代码中使用#include
例: gcc hello.c -include /root/pianopan.h
链接选项
更多选项可以:man ld
连接器
含义
-L dir
把dir加到库文件的搜索路径中,而且gcc会在搜索标准库文件之前先搜索dir。一般直接写绝对路径。
如果库文件的路径是本.o文件同级目录下的lib目录,可用-L lib
如果库文件路径是本.o文件同级目录,可用-L.
例: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test
-llibrary
在连接的时候搜索library库。如: -lc是链接libc库文件,-lm是链接math库文件。
例: $ gcc test.c -lm -o test
-nostartfiles
不连接系统标准启动文件,而标准库文件仍然正常使用。crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件,一般应用程序需要这些启动文件
-nostdlib
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
常用于编译内核、bootloader、裸机等程序,它们不需要启动文件、标准库文件,
-static
在支持动态链接的系统上阻止连接共享库,编译出来的可执行程序大小很大。
例:gcc -static -o hello_static hello.o
不使用时,程序执行前要连接共享库文件,所以还需要将共享库放入文件系统
-shared
跟ar工具一样,生成共享OBJ文件(.a文件),它可以和其他OBJ文件连接产生可执行文件。
示例1
当不想以源代码发布程序时,可以使用“-shared”选项生成库文件,如下:
gcc -c -o sub.o sub.c
gcc -c -o main.o main.c
gcc -shared -o sub.a sub.o // 等价于ar cr sub.a sub.o
以后要使用sub.c中的sub_fun函数时,在连接程序时,将sub.a加入即可:
gcc -o test main.o ./sub.a //必须是./sub.a,如果省略 ./ ,会出错,sub.a将不被包含进去。
可将多个文件制作为一个库文件:
gcc -shared -o sub.a sub.o sub1.o sub2.o //等价于 ar cr sub.a sub1.o sub2.o
示例2
-shared -fPIC 可以用来生成动态库(.so文件)
gcc -shared -fPIC -o libfunc.so func.o
LDFLAGS
更多选项可以:man ld
选项
含义
-s
去除可执行文件中的符号表和重定位信息,用于减小可执行文件的大小。
例: gcc -s source_file.c
strip命令:
等于程序做了--strip-debug和--strip-symbol,可以减小大小。
对于静态库.a之类的文件,不能用strip命令,只能用--strip-debug。
对于动态库,可以用strip。
strip命令可以处理可执行文件、目标文件、动态库文件。
-Wl,options options是由一个或多个逗号分隔的传递给链接器的选项列表。其中的每一个选项均会作为命令行选项 提供给链接器。
-Wl,-rpath=dir
或-Wl,-rpath dir
程序运行时,优先到rpath指定的目录去寻找依赖库。
程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。例如:
有动态库libtest.so,可执行程序test1,libtest.so放在test1同目录下,则编译test1时需要添加以下选项:
-L./ -ltest -Wl,-rpath=./
-Wl,--as-needed
不链接用不到的的符号引用(动态库)。
程序中有一些用不到的动态库,但它运行时仍然会被加载进去,如果不链接这些用不到的动态库,可以加快进程启动速度。
-Wl,-On
当n>0时将会优化输出,但是会明显增加连接操作的时间,这个选项是比较安全的。
-Wl,--exclude-libs=ALL
不自动导出库中的符号,也就是默认将库中的符号隐藏。
-Wl,-m
仿真
连接器,当前ld所有可用的仿真可以 通过"ld -V"命令获取。默认值取决于ld的编译时配置。 -Wl,--sort-common
把全局公共符号按照大小排序后放到适当的输出节,以防止符号间因为排布限制而出现间隙。
-Wl,-x
删除所有的本地符号。
-Wl,-X
删除所有的临时本地符号。对于大多数目标平台,就是所有的名字以'L'开头的本地符号。
-Wl,-zcomberloc
组合多个重定位节并重新排布它们,以便让动态符号可以被缓存。
-Wl,--enable-new-dtags
在ELF中创建新式的"dynamic tags",但在老式的ELF系统上无法识别。
-Wl,--no-define-common
限制对普通符号的地址分配。该选项允许那些从共享库中引用的普通符号只在主程序 中被分配地址。这会消除在共享库中的无用的副本的空间,同时也防止了在有多个指定了搜索路径的动态模块在进行运行时符号解析时引起的混乱。
-Wl,--hash-style=gnu
使用gnu风格的符号散列表格式。它的动态链接性能比传统的sysv风格(默认)有 较大提升,但是它生成的可执行程序和库与旧的Glibc以及动态链接器不兼容。
依赖选项
依赖选项
含义
-M
生成文档关联的信息。包含目标文档所依赖的任何源代码。例:gcc -M hello.c
对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 #include引用的所有文件。生成的规则可以是单行,但如果太长,就用`\'-换行符续成多行。规则显示在标准输出,不产生预处理过的C程序。
-MM
和上面的那个相同,但是他将忽略由#include
造成的依赖关系。 -MD
和-M相同,但是输出将导入到.d的文档里面
-MMD
和-MM相同,但是输出将导入到.d的文档里面
-Wa,option
此选项传递option给汇编程式;假如option中间有逗号,就将option分成多个选项,然后传递给会汇编程式
-Wl.option
此选项传递option给连接程式;假如option中间有逗号,就将option分成多个选项,然后传递给会连接程式.
调试选项
调试选项
含义
-g
-glevel生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level可以为1,2,3,默认值为2。
-gstabs
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
-gstabs+
此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
-ggdb
-ggdblevel
此选项将尽可能的生成gdb的能够使用的调试信息.
level可以为1,2,3,默认值为2。
-fprofile-arcs
在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用 -fbranch-probabilities 编译,文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。这类优化信息将会存放在一个以源文 件为名字的并以".da"为后缀的文件中。
警告选项
警告选项
含义
-Wall
可以使用-Wall来开启以下警告:
-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat
-Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration
-Wcomment -Wformat -Wmain (only for C/ObjC and unless
-ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses
-Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point
-Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1
-Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)
-Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value
-Wunused-variable
unused-function:警告声明但是没有定义的static函数;
unused- label:声明但是未使用的标签;
unused-parameter:警告未使用的函数参数;
unused-variable:声明但 是未使用的本地变量;
unused-value:计算了但是未使用的值;
format:printf和scanf这样的函数中的格式字符 串的使用不当;
implicit-int:未指定类型;
implicit-function:函数在声明前使用;
char- subscripts:使用char类作为数组下标(因为char可能是有符号数);
missingbraces:大括号不匹配;
parentheses: 圆括号不匹配;
return-type:函数有无返回值以及返回值类型不匹配;
sequence-point:违反顺序点的代码,比如 a[i] = c[i++];
switch:switch语句缺少default或者switch使用枚举变量为索引时缺少某个变量的case;
strict- aliasing=n:使用n设置对指针变量指向的对象类型产生警告的限制程度,默认n=3;只有在-fstrict-aliasing设置的情况下有 效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的变量为初始化,只在-O2时有 效;
以下是在-Wall中不会激活的警告选项:
cast-align:当指针进行类型转换后有内存对齐要求更严格时发出警告;
sign- compare:当使用signed和unsigned类型比较时;
missing-prototypes:当函数在使用前没有函数原型时;
packed:packed 是gcc的一个扩展,是使结构体各成员之间不留内存对齐所需的空 间,有时候会造成内存对齐的问题;
padded:也是gcc的扩展,使结构体成员之间进行内存对齐的填充,会 造成结构体体积增大.
unreachable-code:有不会执行的代码时.
inline:当inline函数不再保持inline时 (比如对inline函数取地址);
disable-optimization:当不能执行指定的优化时.(需要太多时间或系统资源).
可以使用 -Werror时所有的警告都变成错误,使出现警告时也停止编译.需要和指定警告的参数一起使用.
-W
-Wextra打印一些额外的警告信息。
-w
禁止显示所有警告信息。
-Wshadow
当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。
-Wpointer-arith
对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。
-Wcast-qual
当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。
-Waggregate-return
如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。
-Winline
无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。
-Werror
把警告当作错误。出现任何警告就放弃编译。
-Wunreachable-code
如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。
-Wcast-align
一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。
-Wundef
当一个没有定义的符号出现在 #if 中时,给出警告。
优化选项
优化选项
含义
-O0
禁止编译器进行优化。默认为此项。编译较快,编译结果可调试,语句独立
-O
-O1尝试优化编译时间和可执行文件大小。编译慢,结果不可调试,语句不独立
-O2
更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。
-O3
在 -O2 的基础上再打开一些优化选项:
-finline-functions
允许编译器选择某些简单的函数在其被调用处展开,比较安全的选项,特别是在CPU二级缓存较大时建议使用。
-funswitch-loops
将循环体中不改变值的变量移动到循环体之外。
-fgcse-after-reload
为了清除多余的溢出,在重载之后执行一个额外的载入消除步骤。
-Os
对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。
-finline-functions
把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。
-fstrict-aliasing
施加最强的别名规则(aliasing rules)。
-fomit-frame-pointer
对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代 码,同时对许多函数提供一个额外的寄存器。所有"-O"级别都打开它,但仅在调试器可以不依靠栈指针运行时才有效。在AMD64平台上此选项默认打开,但 是在x86平台上则默认关闭。建议显式的设置它。
-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N这 四个对齐选项在"-O2"中打开,其中的根据不同的平台N使用不同的默认值。如果你想指定不同于默认值的N,也可以单独指定。比如,对于L2- cache>=1M的cpu而言,指定 -falign-functions=64 可能会获得更好的性能。建议在指定了 -march 的时候不明确指定这里的值。
-fforce-addr
必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这 个选项可以改进代码。
-finline-limit=n
对伪指令数超过n的函数,编译程序将不进行内联展开,默认为600。增大此值将增加编译时间 和编译内存用量并且生成的二进制文件体积也会变大,此值不宜太大。
-fmerge-all-constants
试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每 个变量都必须有不同的存储位置,所以该选项可能会导致某些不兼容的行为。
-fgcse-sm
在全局公共子表达式消除之后运行存储移动,以试图将存储移出循环。gcc-3.4中曾属于"-O2"级别的 选项。
-fgcse-las
在全局公共子表达式消除之后消除多余的在存储到同一存储区域之后的加载操作。gcc-3.4中曾属于"-O2"级别的选项。
-floop-optimize
已废除(GCC-4.1曾包含在"-O1"中)。
-floop-optimize2
使用改进版本的循环优化器代替原来"-floop-optimize"。该优化器将使用不同 的选项(-funroll-loops, -fpeel-loops, -funswitch-loops, -ftree-loop-im)分别控制循环优化的不同方面。目前这个新版本的优化器尚在开发中,并且生成的代码质量并不比以前的版本高。已废除,仅存在 于GCC-4.1之前的版本中。
-funsafe-loop-optimizations
假定循环不会溢出,并且循环的退出条件不是无穷。这将可以在一个比较 广的范围内进行循环优化,即使优化器自己也不能断定这样做是否正确。
-fsched-spec-load
允许一些装载指令执行一些投机性的动作。
-ftree-loop-linear
在trees上进行线型循环转换。它能够改进缓冲性能并且允许进行更进一步的循环优化。
-fivopts
在trees上执行归纳变量优化。
-ftree-vectorize
在trees上执行循环向量化。
-ftracer
执行尾部复制以扩大超级块的尺寸,它简化了函数控制流,从而允许其它的优化措施做的更好。据说挺有效。
-funroll-loops
仅对循环次数能够在编译时或运行时确定的循环进行展开,生成的代码尺寸将变大,执行速度可能变快 也可能变慢。
-fprefetch-loop-arrays
生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库 相关的大型软件等。具体效果如何取决于代码。
-fweb
建立经常使用的缓存器网络,提供更佳的缓存器使用率。gcc-3.4中曾属于"-O3"级别的选项。
-ffast-math
违反IEEE/ANSI标准以提高浮点数计算速度,是个危险的选项,仅在编译不需要严格遵守IEEE规范且浮点计算密集的程序考虑采用。
-fsingle-precision-constant
将浮点常量作为单精度常量对待,而不是隐式地将其转换为双精度。
-fbranch-probabilities
在使用 -fprofile-arcs 选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,文件中所产生的信息将被用来优化那些经常发生的分支代码。 如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-frename-registers
试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。gcc-3.4中 曾属于"-O3"级别的选项。
-fbranch-target-load-optimize
-fbranch-target-load-optimize2
在 执行序启动以及结尾之前执行分支目标缓存器加载最佳化。
-fstack-protector
在关键函数的堆栈中设置保护值。在返回地址和返回值之前,都将验证这个保护值。如果出现了 缓冲区溢出,保护值不再匹配,程序就会退出。程序每次运行,保护值都是随机的,因此不会被远程猜出。
-fstack-protector-all
同上,但是在所有函数的堆栈中设置保护值。
--param max-gcse-memory=xxM
执行GCSE优化使用的最大内存量(xxM),太小将使该优化无法进 行,默认为50M。
--param max-gcse-passes=n
执行GCSE优化的最大迭代次数,默认为 1。
代码生成选项
选项
含义
-fno-bounds-check
关闭所有对数组访问的边界检查。该选项将提高数组索引的性能,但当超出数组边界时,可能会 造成不可接受的行为。
-freg-struct-return
如果struct和union足够小就通过寄存器返回,这将提高较小结构的效率。如果 不够小,无法容纳在一个寄存器中,将使用内存返回。建议仅在完全使用GCC编译的系统上才使用。
-fPIC
或-fpic
生成可用于共享库的位置独立代码。-shared -fPIC组合可以生成动态库(.so文件)。
所有的内部寻址均通过全局偏移表完成。要确定一个地址,需要将代码自身的内存位置 作为表中一项插入。该选项产生可以在共享库中存放并从中加载的目标模块。
不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-fstack-check
为防止程序栈溢出而进行必要的检测,仅在多线程环境中运行时才可能需要它。
-fvisibility=hidden
设置默认的ELF镜像中符号的可见性为隐藏。使用这个特性可以非常充分的提高连接和加 载共享库的性能,生成更加优化的代码,提供近乎完美的API输出和防止符号碰撞。我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility-inlines-hidden 选项
标准及语言选项
标准及语言选项
描述
标准类
-ansi
支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。(包括禁止一些asm inline typeof关键字,连同UNIX,vax等预处理宏
-std=c89
-iso9899:1990指明使用标准 ISO C90 作为标准来编译程序。
-std=c99
-std=iso9899:1999指明使用标准 ISO C99 作为标准来编译程序。
-std=c++98
指明使用标准 C++98 作为标准来编译程序。
-std=gnu9x
-std=gnu99使用 ISO C99 再加上 GNU 的一些扩展。
-fno-asm
不把asm, inline或typeof当作关键字,因此这些词可以用做标识符。用 __asm__, __inline__和__typeof__能够替代它们。 `-ansi' 隐含声明了`-fno-asm'。
-fgnu89-inline
告诉编译器在 C99 模式下看到 inline 函数时使用传统的 GNU 句法。
C语言选项
-fsigned-char
-funsigned-char把char定义为有/无符号类型,如同signed char/unsigned char。
-traditional
尝试支持传统C编译器的某些方面。详见GNU C手册。
-fno-builtin
-fno-builtin-function不接受没有 __builtin_ 前缀的函数作为内建函数。
-trigraphs
支持ANSI C的三联符( trigraphs)。`-ansi'选项隐含声明了此选项。
-fsigned-bitfields
-funsigned-bitfields如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域或无符号位域。缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数。
-Wstrict-prototypes
如果函数的声明或定义没有指出参数类型,编译器就发出警告。很有用的警告。
-Wmissing-prototypes
如果没有预先声明就定义了全局函数,编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这个选项 的目的是检查没有在头文件中声明的全局函数。
-Wnested-externs
如果某extern声明出现在函数内部,编译器就发出警告。
C++选项
-ffor-scope
从头开始执行程序,也允许进行重定向。
-fno-rtti
关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能,关闭它会节省一些空间。
-Wctor-dtor-privacy
当一个类没有用时给出警告。因为构造函数和析构函数会被当作私有的。
-Wnon-virtual-dtor
当一个类有多态性,而又没有虚析构函数时,发出警告。-Wall会开启这个选项。
-Wreorder
如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致,给出警告。
-Wno-deprecated
使用过时的特性时不要给出警告。
-Woverloaded-virtual
如果函数的声明隐藏住了基类的虚函数,就给出警告。
机器依赖选项
(仅针对x86和x86_64)
选项
含义
-mtune=cpu-type
为特定的cpu-type编译二进制代码(不能在更低级别的cpu上运行)。
Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。
AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)
-msse
-msse2
-mmmx
-mno-sse
-mno-sse2
-mno-mmx-mssse3(GCC-4.3 新增)
-msse4.1(GCC-4.3新增)
-msse4.2(GCC-4.3新增)
-msse4(含4.1和 4.2,GCC-4.3新增)是否使用相应的扩展指令集以及内置函数,按照自己的cpu选择
-m32/-m64
生成32位/64位机器上的代码。
-mpush-args
-mno-push-args(不)使用 push 指令来进行存储参数。默认是使用。
-mregparm=num
当传递整数参数时,控制所使用寄存器的个数。
-mfpmath=sse
P3和athlon-xp级别及以上的cpu支持"sse"标量浮点指令。仅建议在P4和K8以上级 别的处理器上使用该选项。
-malign-double
将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大,并且不能与未使用该选项编译的程序一起工作。
-m128bit-long-double
指定long double为128位,pentium以上的cpu更喜欢这种标准,并且符合x86-64的ABI标准,但是却不附合i386的ABI标准。
-mregparm=N
指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。
-msseregparm
使用SSE寄存器传递float和double参数和返回值。注意:当你使用了这个选项以后,你必须 使用同一参数重新构建所有的模块,包括所有的库。
-maccumulate-outgoing-args
指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中 是较快的方法;缺点是会明显增加二进制文件尺寸。
-mthreads
支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。使用这个选 项时会定义"-D_MT",它将包含使用选项"-lmingwthrd"连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。
-minline-all-stringops
默认时GCC只将确定目的地会被对齐在至少4字节边界的字符串操作内联进程序代 码。该选项启用更多的内联并且增加二进制文件的体积,但是可以提升依赖于高速 memcpy, strlen, memset 操作的程序的性能。
-minline-stringops-dynamically
GCC-4.3新增。对未知尺寸字符串的小块操作使用内联代 码,而对大块操作仍然调用库函数,这是比"-minline-all-stringops"更聪明的策略。决定策略的算法可以通 过"-mstringop-strategy"控制。
-momit-leaf-frame-pointer
不为叶子函数在寄存器中保存栈指针,这样可以节省寄存器,但是将会使调试 变的困难。注意:不要与 -fomit-frame-pointer 同时使用,因为会造成代码效率低下。
-mcmodel=small
[默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也 可以动态连接。仅用于x86_64[含EMT64]环境。
-mcmodel=kernel
内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!仅用于 x86_64[含EMT64]环境。
-mcmodel=medium
程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可 以动态连接。注意:共享库不能使用这个选项编译!仅用于x86_64[含EMT64]环境。
传递给汇编器的选项
选项
含义
-Wa,options
options是一个或多个由逗号分隔的可以传递给汇编器的选项列表。其中的每一个均可作为命令行选项 传递给汇编器。
-Wa,--strip-local-absolute
从输出符号表中移除局部绝对符号。
-Wa,-R
合并数据段和正文段,因为不必在数据段和代码段之间转移,所以它可能会产生更短的地址移动。
-Wa,--64
设置字长为64bit,仅用于x86_64,并且仅对ELF格式的目标文件有效。此外,还需要使 用"--enable-64-bit-bfd"选项编译的BFD支持。
-Wa,-march=CPU
按照特定的CPU进行优化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。
仅可用于 CFLAGS 的选项
选项
含义
-fhosted
按宿主环境编译,其中需要有完整的标准库,入口必须是main()函数且具有int型的返回值。内核以外几乎 所有的程序都是如此。该选项隐含设置了 -fbuiltin,且与 -fno-freestanding 等价。
-ffreestanding
按独立环境编译,该环境可以没有标准库,且对main()函数没有要求。最典型的例子就是操作系 统内核。该选项隐含设置了 -fno-builtin,且与 -fno-hosted 等价。
仅可用于 CXXFLAGS 的选项
选项
含义
-fno-enforce-eh-specs
C++标准要求强制检查异常违例,但是该选项可以关闭违例检查,从而减小生成代码 的体积。该选项类似于定义了"NDEBUG"宏。
-fno-rtti
如果没有使用'dynamic_cast'和'typeid',可以使用这个选项禁止为包含虚方法的类生成 运行时表示代码,从而节约空间。此选项对于异常处理无效(仍然按需生成rtti代码)。
-ftemplate-depth-n
将最大模版实例化深度设为'n',符合标准的程序不能超过17,默认值为500。
-fno-optional-diags
禁止输出诊断消息,C++标准并不需要这些消息。
-fno-threadsafe-statics
GCC自动在访问C++局部静态变量的代码上加锁,以保证线程安全。如果你不 需要线程安全,可以使用这个选项。
-fvisibility-inlines-hidden
默认隐藏所有内联函数,从而减小导出符号表的大小,既能缩减文件的大 小,还能提高运行性能,我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility=hidden 选项。
系统环境变量
变量
含义
LANG
指定编译程序使用的字符集,可用于创建宽字符文件、串文字、注释;默认为英文。[目前只支持日文"C-JIS,C- SJIS,C-EUCJP",不支持中文]
LC_ALL
指定多字节字符的字符分类,主要用于确定字符串的字符边界以及编译程序使用何种语言发出诊断消息;默认设置与 LANG相同。中文相关的几项:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"。
本文参考链接:https://www.cnblogs.com/LiuYanYGZ/p/5548855.html