`

gcc编译选项

 
阅读更多

 

转载自http://blogold.chinaunix.net/u3/94700/showart.php?id=2340792

gcc 提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常可以使用-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时所有的警告都变成错误,使出现警告时也停止编译.需要和指定警告的参数一起使用. 
优化: 
gcc默认提供了5级优 化选项的集合: 
-O0:无优化(默认) 
-O和-O1:使用能减少目标文 件 大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用. 
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性 能. 
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项. 
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项. 
-O1包含的选项-O1通常可以安全的和调试的选项一起使用: 
           -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch 
           -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion 
           -finline-small-functions -fipa-pure-const -fipa-reference 
           -fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch 
           -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse 
           -ftree-fre -ftree-sra -ftree-ter -funit-at-a-time 
以下所有的优化选项需要在名字 前加上-f,如果不需要此选项可以使用-fno-前缀 
defer-pop:延迟到只在必要时从函数参数栈中pop参数; 
thread- jumps:使用跳转线程优化,避免跳转到另一个跳转; 
branch-probabilities:分支优化; 
cprop- registers:使用寄存器之间copy-propagation传值; 
guess-branch-probability:分支预测; 
omit- frame-pointer:可能的情况下不产生栈帧; 
-O2:以下是-O2在-O1基础上增加的优化选项: 
           -falign-functions  -falign-jumps -falign-loops  -falign-labels 
           -fcaller-saves -fcrossjumping -fcse-follow-jumps  -fcse-skip-blocks 
           -fdelete-null-pointer-checks -fexpensive-optimizations -fgcse 
           -fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove 
           -freorder-blocks  -freorder-functions -frerun-cse-after-loop 
           -fsched-interblock  -fsched-spec -fschedule-insns 
           -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre 
           -ftree-vrp 
cpu架构的优化选项,通常是-mcpu(将被取消);-march,-mtune 
Debug选项: 
在 gcc编译源代码时指定-g选项可以产生带有调试信息的目标代码,gcc可以为多个不同平台上帝不同调试器提供调试信息,默认gcc产生的调试信息是为 gdb使用的,可以使用-gformat 指定要生成的调试信息的格式以提供给其他平台的其他调试器使用.常用的格式有 
-ggdb:生成gdb专 用的调试信息,使用最适合的格式(DWARF 2,stabs等)会有一些gdb专用的扩展,可能造成其他调试器无法运行. 
-gstabs:使用 stabs格式,不包含gdb扩展,stabs常用于BSD系统的DBX调试器. 
-gcoff:产生COFF格式的调试信息,常用于System V下的SDB调试器; 
-gxcoff:产生XCOFF格式的调试信息,用于IBM的RS/6000下的DBX调试器; 
-gdwarf- 2:产生DWARF version2 的格式的调试信息,常用于IRIXX6上的DBX调试器.GCC会使用DWARF version3的一些特性. 
可 以指定调试信息的等级:在指定的调试格式后面加上等级: 
如: -ggdb2 等,0代表不产生调试信息.在使用-gdwarf-2时因为最早的格式为-gdwarf2会造成混乱,所以要额外使用一个-glevel来指定调试信息的 等级,其他格式选项也可以另外指定等级. 
gcc可以使用-p选项指定生成信息以供porf使用.

GCC常用选项

选项 
含义

--help 
--target-help 
显示 gcc 帮助说明。‘target-help’是显示目标机器特定的命令行选项。

--version 
显示 gcc 版本号和版权信息 。

-o outfile 
输出到指定的文件。

-x language 
指明使用的编程语言。允许的语言包括:c c++ assembler none 。 ‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言。

-v 
打印较多信息,显示编译器调用的程序。

-### 
与 -v 类似,但选项被引号括住,并且不执行命令。

-E 
仅作预处理,不进行编译、汇编和链接。如上图所示。

-S 
仅编译到汇编语言,不进行汇编和链接。如上图所示。

-c 
编译、汇编到目标代码,不进行链接。如上图所示。

-pipe 
使用管道代替临时文件。

-combine 
将多个源文件一次性传递给汇编器。

3 其他GCC选项

更多有用的GCC选项:

命令 
描述

-l library 
-llibrary 
进行链接时搜索名为library的库。 
例子: $ gcc test.c -lm -o test

-Idir 
dir 加入到搜索头文件的路径列表中。 
例子: $ gcc test.c -I../inc -o test

-Ldir 
dir 加入到搜索库文件的路径列表中。 
例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test

-Dname 
预定义一个名为name 的宏,值为1。 
例子: $ gcc -DTEST_CONFIG test.c -o test

-Dname =definition 
预定义名为name ,值为definition 的宏。

-ggdb 
-ggdblevel 
为调试器 gdb 生成调试信息。level 可以为1,2,3,默认值为2。

-g 
-glevel 
生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level 取值同上。

-s 
去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。

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

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

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

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

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

Warnings

-Wall 
会打开一些很有用的警告选项,建议编译时加此选项。

-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 中时,给出警告。

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

Optimization

-O0 
禁止编译器进行优化。默认为此项。

-O 
-O1 
尝试优化编译时间和可执行文件大小。

-O2 
更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。

-O3 
在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。

-Os 
对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。

-finline-functions 
把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。

-fstrict-aliasing 
施加最强的别名规则(aliasing rules)。

Standard

-ansi 
支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。

-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 options

-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++ options

-ffor-scope 
从头开始执行程序,也允许进行重定向。

-fno-rtti 
关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能,关闭它会节省一些空间。

-Wctor-dtor-privacy 
当一个类没有用时给出警告。因为构造函数和析构函数会被当作私有的。

-Wnon-virtual-dtor 
当一个类有多态性,而又没有虚析构函数时,发出警告。-Wall会开启这个选项。

-Wreorder 
如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致,给出警告。

-Wno-deprecated 
使用过时的特性时不要给出警告。

-Woverloaded-virtual 
如果函数的声明隐藏住了基类的虚函数,就给出警告。

Machine Dependent Options (Intel)

-mtune=cpu-type 
为指定类型的 CPU 生成代码。cpu-type 可以是:i386,i486,i586,pentium,i686,pentium4 等等。

-msse 
-msse2 
-mmmx 
-mno-sse 
-mno-sse2 
-mno-mmx 
使用或者不使用MMX,SSE,SSE2指令。

-m32 
-m64 
生成32位/64位机器上的代码。

-mpush-args 
-mno-push-args 
(不)使用 push 指令来进行存储参数。默认是使用。

-mregparm=num 
当传递整数参数时,控制所使用寄存器的个数。

分享到:
评论

相关推荐

    arm-linux-gcc编译选项.pdf

    以下是arm-linux-gcc编译选项的详细知识点说明: 1. 编译过程的四个阶段: - 预处理阶段:GCC会对源文件进行预处理,展开宏定义、处理条件编译指令、包含头文件等。 - 编译阶段:经过预处理的源文件会被转化为...

    gcc 编译 优化 选项

    GCC编译优化选项详解 GCC(GNU Compiler Collection)是GNU项目的一部分,用于将源代码转换为机器可执行的指令。GCC提供了丰富的编译优化选项,旨在提升程序的运行效率和代码大小,同时在一定程度上牺牲编译时间和...

    gcc编译选项问题.doc

    总之,理解GCC编译选项和编译过程对于C语言开发至关重要。通过熟练掌握这些知识,开发者能够更有效地调试和优化代码,确保程序的正确性和高效性。在学习编程的过程中,逐步添加功能并保持代码简洁,是避免大量错误和...

    Gcc编译选项-报错告警选项.rar

    "Gcc编译选项-报错告警选项.rar"这个压缩包文件很可能包含了关于如何设置GCC编译器在遇到错误和警告时的具体行为的相关资料。 在GCC中,错误和警告选项是非常重要的,它们直接影响到编译过程的严谨性和代码质量。...

    gcc编译选项详解 让你轻松掌握gcc/g++

    介绍常用GCC常用编译选项,让你轻松在linux环境下开发程序.

    arm-linux-gcc编译选项归类.pdf

    arm-linux-gcc编译选项归类.pdf

    nordic52832 nordic使用gcc编译环境搭建资料合集20220506 085836

    资料合集中的"nordic52832 nordic使用gcc编译环境搭建和使用说明"文章可能会详细解释以上每一步,包括具体的命令行选项、配置文件设置以及常见问题的解决方法。对于初学者来说,这样的资源是非常宝贵的,因为它可以...

    gcc编译原理例子文件

    **GCC编译原理详解** GCC(GNU Compiler Collection)是GNU项目的一部分,是一个广泛使用的开源编译器套件,用于将源代码编译成可执行程序。这个压缩包包含的文件展示了GCC编译过程的不同阶段,让我们逐一分析这些...

    gcc 常用编译选项参数

    在实际工作中,掌握一些常用的GCC编译选项参数,能够极大地提高开发效率和代码质量。** ### **1. `-c` 参数** 该选项告诉GCC只编译源代码,不链接生成可执行文件。这通常用于预编译头文件或在大型项目中分步骤构建...

    gcc编译stm32f103+freeROTS代码

    6. 编写Makefile或使用IDE如Keil、IAR等,配置编译选项、链接器脚本等。 7. 使用编译命令(如`arm-none-eabi-gcc`)进行编译和链接,生成`.elf`文件。 8. 使用工具(如`arm-none-eabi-objcopy`)将`.elf`转换为`.hex...

    gcc编译数据库1

    GCC编译数据库并不是一个传统意义上的数据库,而是一种存储项目编译指令的数据结构或文件格式,通常用于记录编译过程中使用的命令行选项。这种数据库有助于自动化工具理解如何编译项目中的每个源文件,从而简化了...

    GCC编译命令 Gcc命令行详解

    其中,options 是可选的编译选项,source_files 是要编译的源文件,output_file 是编译生成的可执行文件。 GCC 编译命令的常用选项包括: * -c:将源文件编译成目标文件,但不链接生成可执行文件。 * -o:指定输出...

    linux Gcc 编译详解

    本文将详细讲解Linux下GCC的编译过程,包括预处理、编译、汇编和链接四个阶段,并探讨相关的编译选项和优化原理。 1. 预处理 预处理是GCC处理C源代码的第一步,由cpp程序负责。在这个阶段,GCC执行以下操作: - ...

    适用于centos 8 的gcc编译环境

    标题 "适用于centos 8 的gcc编译环境" 指出我们要讨论的是在CentOS 8操作系统上安装和配置GCC编译环境的过程。GCC(GNU Compiler Collection)是GNU项目的一部分,它是一套包含了C、C++、Objective-C、Fortran、Ada...

    如何在Linux下用gcc编译c程序

    GCC还支持很多编译选项,例如`-Wall`用于开启警告,`-g`用于生成调试信息,`-O2`用于优化代码等。在开发过程中,这些选项非常有用: ```bash gcc -Wall -g -O2 -o my_program main.c helper.c ``` 在编译过程中,...

    linux下GCC编译C程序

    【GCC编译C程序】是Linux环境中开发C语言软件的核心环节。GNU编译器集(GCC),最初称为GNU C编译器,由Richard Stallman在1987年发起,旨在构建符合自由软件理念的编译器,用于构建GNU项目中的其他软件。GCC很快因...

    LINUX下的GCC编译指南

    GCC 编译指南提供了多种参数选项,用于控制编译过程的各个阶段。下面对 GCC 编译指南的使用方法进行详细介绍。 基本用法 GCC 编译指南的基本用法是:gcc [options] [filenames]。其中,options 是编译器的选项,...

    GCC编译环境配置(VSCode).pdf

    GCC 编译环境配置(VSCode) titles: GCC 编译环境配置(VSCode) GCC 编译环境配置是指在 VSCode 中配置 GCC 编译环境,以便进行 C/C++ 编程和调试。GCC 是一个广泛使用的编译器,用于将 C/C++ 代码编译成可执行...

Global site tag (gtag.js) - Google Analytics