GCC常用编译选项

gcc option分类介绍http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/Option-Summary.html
-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  
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 ,例子用法:gcc -c hello.c 将生成.o的obj文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码。例子用法: gcc -S hello.c将生成.s的汇编代码,你可以用文本编辑器察看
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法:gcc -E hello.c > pianoapan.txt  gcc -E hello.c | more 
-o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,例子用法:gcc -o hello.exe hello.c 以及gcc -o hello.asm -S hello.c
-pipe 使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c
-ansi 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏,
-fno-asm 此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。      
-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(后两个参数) 
-include file 包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include<filename> 
  例子用法: 
  gcc hello.c -include /root/pianopan.h   
-imacros file 将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中   
-Dmacro 相当于C语言中的#define macro 
-Dmacro=defn 相当于C语言中的#define macro=defn 
-Umacro 相当于C语言中的#undef macro
-undef 取消对任何非标准宏的定义 
-Idir 在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找. 对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找 
-I- 就是取消前一个参数的功能,所以一般在-Idir之后使用 
-idirafter dir 在-I的目录里面查找失败,讲到这个目录里面查找.  
-iprefix prefix 
-iwithprefix dir 一般一起使用,当-I的目录查找失败,会到prefix+dir下查找 
-nostdinc 使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置 
-nostdin C++ 规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库使用  
-C 在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 
-M 生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。 
-MM 和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。 
-MD 和-M相同,但是输出将导入到.d的文件里面 
-MMD 和-MM相同,但是输出将导入到.d的文件里面 
-Wa,option 此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序   
-Wl.option 此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.
-llibrary 制定编译的时候使用的库例子用法gcc -lcurses hello.c 使用ncurses库编译程序    
-Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。 
-O0  -O1  -O2  -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高      
-g 只是编译器,在编译的时候,产生调试信息。 
-gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息. 
-gstabs+ 此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息. 
-ggdb 此选项将尽可能的生成gdb的可以使用的调试信息.
-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行.
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-traditional 试图让编译器支持传统的C语言特性


GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件(hello.C): 
#include <iostream> 
void main (void) 
  cout << "Hello, world!" << endl; 
}

则可以如下调用 g++ 命令编译、连接并生成可执行文件: 
$ g++ -o hello hello.C 
$ ./hello 
Hello, world!


**********************gcc/egcs 的主要选项********* 
gcc 命令的常用选项 
选项 解释 
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 
-DMACRO 以字符串“1”定义 MACRO 宏。 
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 
-E 只运行 C 预编译器。 
-g 生成调试信息。GNU 调试器可利用该信息。 
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 
-lLIBRARY 连接时搜索指定的函数库LIBRARY。 
-m486 针对 486 进行代码优化。   
-UMACRO 取消对 MACRO 宏的定义。

转自http://www.linuxsir.org/bbs/thread222670.html
-w 不生成任何警告信息。 
-Wall 生成所有警告信息。
-Werror 将所有警告转换为错误
-v 显示编译程序的当前版本号
-V<version> 指定gcc将要运行的版本。只有在安装了多个版本gcc的机器上才有效。
-pedantic 如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)
-std=<name> 指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline (一般不用该选项)
-static 连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。
-shared 连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。
-shared-libgcc 该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。
-specs=<filename> gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。
-pipe 使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。建议使用。
-o <filename> 指定输出文件,对各种输出皆有效。由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。
--help 显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。
--target-help 显示目标机器相关的命令行选项列表
-b<machine> 指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib/<machine>/<version>
-B<lib-prefix> 指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。
-I<dir> 指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。
-dumpmachine 显示该程序的目标机名字,不做其他任何动作
-dumpspecs 显示构件编译程序的规范信息,包括用来编译、汇编和连接gcc编译程序自身用到的所有选项,不做其他任何动作。
-dumpversion 显示编译程序自身的版本号,不做其他任何动作
-falign-functions=N 将所有函数的起始地址在N(N=1,2,4,8,16...)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-falign-jumps=N 将分支目标在N(N=1,2,4,8,16...)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-fno-align-labels 建议使用它,以保证不和-falign-jumps("-O2"默认启用的选项)冲突
-fno-align-loops 建议使用它,以确保不会在分支目标前插入多余的空指令。
-fbranch-probabilities 在使用"-fprofile-arcs"选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,文件中所产生的信息将被用来优化那些经常发生的分支代码。如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-fno-guess-branch-probability 默认情况下gcc将使用随机模型进行猜测哪个分支更可能被经常执行,并以此来优化代码,该选项关闭它。
-fprofile-arcs 在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用"-fbranch-probabilities"编译,文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-fforce-addr 必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-fforce-mem 必须将数值复制到寄存器中才能对他们进行运算。由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-ffreestanding 所编译的程序能够在独立的环境中运行,该环境可以没有标准库,而且可以不从main()函数开始运行。该选项将设置"-fno-builtin",且等同于"-fno-hosted"。
-fhosted 所编译的程序需要运行在宿主环境中,其中需要有完整的标准库,而且main()函数具有int型的返回值。
-fno-builtin 除非利用"__builtin_"进行引用,否则不识别所有内建函数。
-fmerge-all-constants 试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每个变量都必须有不同的存储位置。
-fmove-all-movables 将所有不变的表达式移动到循环体之外,这种做法的好坏取决于源代码中的循环结构。
-fnon-call-exceptions 产生的代码可供陷阱指令(如非法浮点运算和非法内存寻址)抛出异常,需要相关平台的运行时支持,并不普遍有效。
-fomit-frame-pointer 对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,并将寄存器用于普通用途。所有"-O"级别都打开着一选项,但仅在调试器可以不依靠栈指针运行时才有效。建议不需要调试的情况下显式的设置它。
-fno-optional-diags 禁止输出诊断消息,C++标准并不需要这些消息。
-fpermissive 将代码中与标准不符合的诊断消息作为警告而不是错误输出。
-fpic 生成可用于共享库的位置独立代码(PIC),所有的内存寻址均通过全局偏移表(GOT)完成。该选项并非在所有的机器上都有效。要确定一个地址,需要将代码自身的内存位置作为表中的一项插入。该选项可以产生在共享库中存放并从中加载的目标模块。
-fprefetch-loop-arrays 生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。
-freg-struct-return 生成用寄存器返回短结构的代码,如果寄存器无法荣纳将使用内存。
-fstack-check 为防止程序栈溢出而进行必要的检测,在多线程环境中运行时才可能需要它。
-ftime-report 编译完成后显示编译耗时的统计信息
-funroll-loops 如果在编译时可以确定迭代的次数非常少而且循环中的指令也非常少,可以使用该选项进行循环展开,以驱除循环和复制指令。
-finline-limit=<size> 对伪指令数超过<size>的函数,编译程序将不进行展开,默认为600
--param <name>=<value> gcc内部存在一些优化代码程度的限制,调整这些限制就是调整整个优化全局。下面列出了参数的名字和对应的解释:
名字 解释
max-delay-slot-insn-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为100
max-delay-slot-live-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为333
max-gcse-memory 执行GCSE优化使用的最大内存量,太小将使该优化无法进行,默认为50M
max-gcse-passes 执行GCSE优化的最大迭代次数,默认为1


-mfpmath=sse P3和athlon-tbird以上级别的cpu支持
-masm=<dialect> 使用指定的dialect输出汇编语言指令,可以使用"intel"或"att";默认为"att"
-mieee-fp 指定编译器使用IEEE浮点比较,这样将会正确的处理比较结果为无序的情况。
-malign-double 将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大。
-m128bit-long-double 指定long double为128位,pentium以上的cpu更喜欢这种标准。
-mregparm=N 指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。

-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
上面的这些不用解释了,一看就明白,根据自己的CPU决定吧

-maccumulate-outgoing-args 指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中是较快的方法;缺点是会增加代码尺寸。
-mthreads 支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。使用这个选项时会定义"-D_MT",它将包含使用选项"-lmingwthrd"连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。
-minline-all-stringops 嵌入所有的字符串操作。可以提高字符串操作的性能,但是会增加代码尺寸。
-momit-leaf-frame-pointer 不为叶子函数在寄存器中保存栈指针,这样可以节省寄存器,但是将会是调试变的困难。参见"-fomit-frame-pointer"。

下面这几个仅用于x86_64环境:

-m64 生成专门运行于64位环境的代码,不能运行于32位环境
-mcmodel=small [默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也可以动态连接。
-mcmodel=kernel 内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!
-mcmodel=medium 程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可以动态连接。
注意:共享库不能使用这个选项编译!
-mcmodel=large 对地址空间没有任何限制,这个选项的功能目前尚未实现。

==============================
既然已经讲了这么多了索性再讲讲gcc使用的一些环境变量
除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其实是Autoconf的环境变量),再挑几个说说:
所有的PATH类环境变量(除LD_RUN_PATH外)都是用冒号分割的目录列表。
C_INCLUDE_PATH 编译C程序时使用的环境变量,用于查找头文件。
CPLUS_INCLUDE_PATH 编译C++程序时使用的环境变量,用于查找头文件。
OBJC_INCLUDE_PATH 编译Obj-C程序时使用的环境变量,用于查找头文件。
CPATH 编译C/C++/Obj-C程序时使用的环境变量,用于查找头文件。
COMPILER_PATH 如果没有用GCC_EXEC_PREFIX定位子程序,编译程序将会在此查找它的子程序。
LIBRARY_PATH 连接程序将在这些目录中寻找特殊的连接程序文件。
LD_LIBRARY_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:程序会查找该目录列表以寻找共享库。当不能够在编译程序的目录中找到共享库的时候,执行程序必须设置该环境变量。
LD_RUN_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:它在运行时指出了文件的名字,运行的程序可以由此得到它的符号名字和地址。由于地址不会重新载入,因而可能符号应用其他文件中的绝对地址。这个和ld工具使用的"-R"选项完全一样。
GCC_EXEC_PREFIX 编译程序执行所有子程序的名字的前缀,默认值是"<prefix>/lib/gcc-lib/",其中的<prefix>是安装时configure脚本指定的前缀。
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"
TMPDIR 编译程序存放临时工作文件的临时目录,这些临时文件通常在编译结束时被删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值