gcc常用编译选项总结

(1)c/c++编译过程

4 个步骤,生成一个可执行程序:

                                 

linux tesseract 编译 linux编译选项_编译器

 

                                                                                              gcc编译过程

     1. 预处理:将(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码              

     2. 编译:   将预处理得到的源代码文件,进行“翻译转换”, 生成汇编代码(编译阶段要检查代码的规范性、是否有语法错误,如函数、变量是否被声明等)

     3. 汇编:   将汇编代码翻译成了机器码,表现为二进制文件

     4. 链接:    将汇编生成的.o文件及其他函数库文件链接起来,生成能在特定平台上运行的可执行程序(在链接程序时,链接器会在所有的目标文件中找寻函数的实现。如果找不到,那到就会报链接错误码(LinkerError))

(2)gcc编译选项

    1. 常用命令选项

 

1 --version   查看gcc版本号
 2 -std        指定C或C++语言标准版本。比如 -std=c89,-std=c99等是C语言的标准版本号。-std=c++11,-std=c++14等就是C++语言的标准版本号
 3 -o          指定输出文件,如果没有-o,输出有可能直接到stdout,有可能到默认的a.out文件
 4 -E          只做pre-process,预编译,要使用-o指定输出文件,此时文件一般都用.i结尾
 5 -S(大写)   编译到(assembly)汇编,使用-o指定输出文件,此时文件一般都用.s结尾;
 6 -c          只编译,不链接,用-o指定输出文件,此时文件一般用.o结尾
 7 -g          附加debug信息,在输出的.o和可执行文件中,有很多.debug段。(compile for debugging)
 8 -static     用静态链接的方式编译,默认是动态链接,静态链接生产的文件体积会很大
 9 -shared     生成.so动态链接库
10 -fPIC       一般在创建.so动态链接库的时候,都要加上-fPIC参数。
11             -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全
12             部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的
13 -O0
14 -O1
15 -O2
16 -O3        编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
17 -Wall      显示大部分编译告警,强烈建议使用。(不是全部哦)
18 
19 -Wextra    打印一些额外的告警信息,一般会与-Wall一起使用。
20 
21 -W         可以用来打开或者关闭某个告警,比如显示这个告警 -Wsequence-point,要关闭它就写 -Wno-sequence-point。
22 
23 -w         关闭所有告警信息
24 
25 -Werror    有warning时也当成error来处理,此时编译会终止。    
26 
27            就是这个选项导致的这这样的错误显示:cc1plus: all warnings being treated as errors。快速地解决方法就是去掉-Werror,可能需要修改makefile。
28 
29 -D         添加宏定义,不用修改代码,就可以控制条件编译开关。
30 
31               比如:-DMARCO,效果相当于 #define MARCO 1
32 
33               比如:-DMARCO=ABCDE,效果相当于 #define MARCO ABCDE
34 
35 -UMARCO    取消宏MARCO的定义
36 
37 -I         提供额外头文件搜索路径,-Idir
38 
39 -L(大写)    提供额外的函数库搜索路径,-Ldir
40 
41 -l(小写)    库链接时搜索指定的函数库,-lLIB
42 
43 -M        生成文件关联的信息。包含目标文件所依赖的所有源代码   
44 
45 -MM       和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系 
46 
47 -MD       和-M相同,但是输出将导入到.d的文件里面   
48 
49 -MMD      和-MM相同,但是输出将导入到.d的文件里面
50 
51 -lstdc++   编译c++代码(相当于g++)

 

   2. 警告信息控制选项

 

1   --all-warnings              此开关缺少可用文档
  2   --extra-warnings            此开关缺少可用文档
  3   -W                          不建议使用此开关;请改用 -Wextra
  4   -Wabi                       当结果与 ABI
  5                               相容的编译器的编译结果不同时给出警告
  6   -Waddress                   使用可疑的内存地址时给出警告
  7   -Waggregate-return          当返回结构、联合或数组时给出警告
  8   -Waliasing                  为可能的虚参重叠给出警告
  9   -Walign-commons             对 COMMON 块对齐的警告
 10   -Wall                       启用大部分警告信息
 11   -Wampersand                 若延续字符常量中缺少 & 则给出警告
 12   -Warray-bounds              当数组访问越界时给出警告
 13   -Warray-temporaries         创建临时数组时给出警告
 14   -Wassign-intercept          当 Objective-C
 15                               赋值可能为垃圾回收所介入时给出警告
 16   -Wattributes                当对属性的使用不合适时给出警告
 17   -Wbad-function-cast         当把函数转换为不兼容类型时给出警告
 18   -Wbuiltin-macro-redefined   当内建预处理宏未定义或重定义时给出警告
 19   -Wc++-compat                当在 C 语言中使用了 C 与 C++
 20                               交集以外的构造时给出警告
 21   -Wc++0x-compat              当 C++ 构造的意义在 ISO C++ 1998 和 ISO
 22                               C++ 200x 中不同时给出警告
 23   -Wcast-align                当转换指针类型导致对齐边界增长时给出警告
 24   -Wcast-qual                 当类型转换丢失限定信息时给出警告
 25   -Wchar-subscripts           当下标类型为“char”时给出警告
 26   -Wcharacter-truncation      对被截断的字符表达式给出警告
 27   -Wclobbered                 对能为"longjmp"或"vfork"所篡改的变量给出警告
 28   -Wcomment                   对可能嵌套的注释和长度超过一个物理行长的
 29                               C++ 注释给出警告
 30   -Wcomments                  -Wcomment 的同义词
 31   -Wconversion                当隐式类型转换可能改变值时给出警告
 32   -Wconversion-extra          对大多数隐式类型转换给出警告
 33   -Wconversion-null           将 NULL 转换为非指针类型时给出警告
 34   -Wcoverage-mismatch         Warn in case profiles in -fprofile-use do not
 35                               match
 36   -Wcpp                       Warn when a #warning directive is encountered
 37   -Wctor-dtor-privacy         当所有构造函数和析构函数都是私有时给出警告
 38   -Wdeclaration-after-statement 当声明出现在语句后时给出警告
 39   -Wdeprecated                使用不建议的编译器特性、类、方法或字段时给出警告
 40   -Wdeprecated-declarations   对 __attribute__((deprecated)) 声明给出警告
 41   -Wdisabled-optimization     当某趟优化被禁用时给出警告
 42   -Wdiv-by-zero               对编译时发现的零除给出警告
 43   -Wdouble-promotion          对从“float”到“double”的隐式转换给出警告
 44   -Weffc++                    对不遵循《Effetive
 45                               C++》的风格给出警告
 46   -Wempty-body                当 if 或 else 语句体为空时给出警告
 47   -Wendif-labels              当 #elif 和 #endif
 48                               后面跟有其他标识符时给出警告
 49   -Wenum-compare              对不同枚举类型之间的比较给出警告
 50   -Werror                     不建议使用此开关;请改用
 51                               -Werror=implicit-function-declaration
 52   -Wextra                     打印额外(可能您并不想要)的警告信息
 53   -Wfloat-equal               当比较浮点数是否相等时给出警告
 54   -Wformat                    对 printf/scanf/strftime/strfmon
 55                               中的格式字符串异常给出警告
 56   -Wformat-contains-nul       当格式字符串包含 NUL 字节时给出警告
 57   -Wformat-extra-args         当传递给格式字符串的参数太多时给出警告
 58   -Wformat-nonliteral         当格式字符串不是字面值时给出警告
 59   -Wformat-security           当使用格式字符串的函数可能导致安全问题时给出警告
 60   -Wformat-y2k                当 strftime 格式给出 2
 61                               位记年时给出警告
 62   -Wformat-zero-length        对长度为 0 的格式字符串给出警告
 63   -Wformat=                   此开关缺少可用文档
 64   -Wignored-qualifiers        当类型限定符被忽略时给出警告。
 65   -Wimplicit                  对隐式函数声明给出警告
 66   -Wimplicit-function-declaration 对隐式函数声明给出警告
 67   -Wimplicit-int              当声明未指定类型时给出警告
 68   -Wimplicit-interface        对带有隐式接口的调用给出警告
 69   -Wimplicit-procedure        对没有隐式声明的过程调用给出警告
 70   -Winit-self                 对初始化为自身的变量给出警告。
 71   -Winline                    当内联函数无法被内联时给出警告
 72   -Wint-to-pointer-cast       当将一个大小不同的整数转换为指针时给出警告
 73   -Wintrinsic-shadow          如果用户过程有与内建过程相同的名字则警告
 74   -Wintrinsics-std            当内建函数不是所选标准的一部分时给出警告
 75   -Winvalid-offsetof          对“offsetof”宏无效的使用给出警告
 76   -Winvalid-pch               在找到了 PCH
 77                               文件但未使用的情况给出警告
 78   -Wjump-misses-init          当跳转略过变量初始化时给出警告
 79   -Wlarger-than-              此开关缺少可用文档
 80   -Wlarger-than=<N>           当目标文件大于 N 字节时给出警告
 81   -Wline-truncation           对被截断的源文件行给出警告
 82   -Wlogical-op                当逻辑操作结果似乎总为真或假时给出警告
 83   -Wlong-long                 当使用 -pedantic 时不对“long
 84                               long”给出警告
 85   -Wmain                      对可疑的“main”声明给出警告
 86   -Wmissing-braces            若初始值设定项中可能缺少花括号则给出警告
 87   -Wmissing-declarations      当全局函数没有前向声明时给出警告
 88   -Wmissing-field-initializers 若结构初始值设定项中缺少字段则给出警告
 89   -Wmissing-format-attribute  当函数可能是 format
 90                               属性的备选时给出警告
 91   -Wmissing-include-dirs      当用户给定的包含目录不存在时给出警告
 92   -Wmissing-noreturn          当函数可能是 __attribute__((noreturn))
 93                               的备选时给出警告
 94   -Wmissing-parameter-type    K&R
 95                               风格函数参数声明中未指定类型限定符时给出警告
 96   -Wmissing-prototypes        全局函数没有原型时给出警告
 97   -Wmudflap                   当构造未被 -fmudflap 处理时给出警告
 98   -Wmultichar                 使用多字节字符集的字符常量时给出警告
 99   -Wnested-externs            当“extern”声明不在文件作用域时给出警告
100   -Wnoexcept                  Warn when a noexcept expression evaluates to
101                               false even though the expression can't actually
102                               throw
103   -Wnon-template-friend       在模板内声明未模板化的友元函数时给出警告
104   -Wnon-virtual-dtor          当析构函数不是虚函数时给出警告
105   -Wnonnull                   当将 NULL 传递给需要非 NULL
106                               的参数的函数时给出警告
107   -Wnormalized=<id|nfc|nfkc>  对未归一化的 Unicode 字符串给出警告
108   -Wold-style-cast            程序使用 C
109                               风格的类型转换时给出警告
110   -Wold-style-declaration     对声明中的过时用法给出警告
111   -Wold-style-definition      使用旧式形参定义时给出警告
112   -Woverflow                  算术表示式溢出时给出警告
113   -Woverlength-strings        当字符串长度超过标准规定的可移植的最大长度时给出警告
114   -Woverloaded-virtual        重载虚函数名时给出警告
115   -Woverride-init             覆盖无副作用的初始值设定时给出警告
116   -Wpacked                    当 packed
117                               属性对结构布局不起作用时给出警告
118   -Wpacked-bitfield-compat    当紧实位段的偏移量因 GCC 4.4
119                               而改变时给出警告
120   -Wpadded                    当需要填补才能对齐结构成员时给出警告
121   -Wparentheses               可能缺少括号的情况下给出警告
122   -Wpmf-conversions           当改变成员函数指针的类型时给出警告
123   -Wpointer-arith             当在算术表达式中使用函数指针时给出警告
124   -Wpointer-sign              赋值时如指针符号不一致则给出警告
125   -Wpointer-to-int-cast       将一个指针转换为大小不同的整数时给出警告
126   -Wpragmas                   对错误使用的 pragma 加以警告
127   -Wproperty-assign-default   Warn if a property for an Objective-C object has
128                               no assign semantics specified
129   -Wprotocol                  当继承来的方法未被实现时给出警告
130   -Wreal-q-constant           Warn about real-literal-constants with 'q'
131                               exponent-letter
132   -Wredundant-decls           对同一个对象多次声明时给出警告
133   -Wreorder                   编译器将代码重新排序时给出警告
134   -Wreturn-type               当 C
135                               函数的返回值默认为“int”,或者 C++
136                               函数的返回类型不一致时给出警告
137   -Wselector                  当选择子有多个方法时给出警告
138   -Wsequence-point            当可能违反定序点规则时给出警告
139   -Wshadow                    当一个局部变量掩盖了另一个局部变量时给出警告
140   -Wsign-compare              在有符号和无符号数间进行比较时给出警告
141   -Wsign-promo                当重载将无符号数提升为有符号数时给出警告
142   -Wstack-protector           当因为某种原因堆栈保护失效时给出警告
143   -Wstrict-aliasing           当代码可能破坏强重叠规则时给出警告
144   -Wstrict-aliasing=          当代码可能破坏强重叠规则时给出警告
145   -Wstrict-null-sentinel      将未作转换的 NULL
146                               用作哨兵时给出警告
147   -Wstrict-overflow           禁用假定有符号数溢出行为未被定义的优化
148   -Wstrict-overflow=          禁用假定有符号数溢出行为未被定义的优化
149   -Wstrict-prototypes         使用了非原型的函数声明时给出警告
150   -Wstrict-selector-match     当备选方法的类型签字不完全匹配时给出警告
151   -Wsuggest-attribute=const   Warn about functions which might be candidates
152                               for __attribute__((const))
153   -Wsuggest-attribute=noreturn 当函数可能是 __attribute__((noreturn))
154                               的备选时给出警告
155   -Wsuggest-attribute=pure    Warn about functions which might be candidates
156                               for __attribute__((pure))
157   -Wsurprising                对“可疑”的构造给出警告
158   -Wswitch                    当使用枚举类型作为开关变量,没有提供
159                               default 分支,但又缺少某个 case
160                               时给出警告
161   -Wswitch-default            当使用枚举类型作为开关变量,但没有提供“default”分支时给出警告
162   -Wswitch-enum               当使用枚举类型作为开关变量但又缺少某个
163                               case 时给出警告
164   -Wsync-nand                 当 __sync_fetch_and_nand 和
165                               __sync_nand_and_fetch
166                               内建函数被使用时给出警告
167   -Wsynth                     不建议使用。此开关不起作用。
168   -Wsystem-headers            不抑制系统头文件中的警告
169   -Wtabs                      允许使用不符合规范的制表符
170   -Wtraditional               使用了传统 C
171                               不支持的特性时给出警告
172   -Wtraditional-conversion    原型导致的类型转换与无原型时的类型转换不同时给出警告
173   -Wtrampolines               Warn whenever a trampoline is generated
174   -Wtrigraphs                 当三字母序列可能影响程序意义时给出警告
175   -Wtype-limits               当由于数据类型范围限制比较结果永远为真或假时给出警告
176   -Wundeclared-selector       当使用 @selector()
177                               却不作事先声明时给出警告
178   -Wundef                     当 #if
179                               指令中用到未定义的宏时给出警告
180   -Wunderflow                 数字常量表达式下溢时警告
181   -Wuninitialized             自动变量未初始化时警告
182   -Wunknown-pragmas           对无法识别的 pragma 加以警告
183   -Wunsafe-loop-optimizations 当循环因为不平凡的假定而不能被优化时给出警告
184   -Wunsuffixed-float-constants 对不带后缀的浮点常量给出警告
185   -Wunused                    启用所有关于“XX未使用”的警告
186   -Wunused-but-set-parameter  Warn when a function parameter is only set,
187                               otherwise unused
188   -Wunused-but-set-variable   Warn when a variable is only set, otherwise unused
189   -Wunused-dummy-argument     对未使用的哑元给出警告。
190   -Wunused-function           有未使用的函数时警告
191   -Wunused-label              有未使用的标号时警告
192   -Wunused-macros             当定义在主文件中的宏未被使用时给出警告
193   -Wunused-parameter          发现未使用的函数指针时给出警告
194   -Wunused-result             当一个带有 warn_unused_result
195                               属性的函数的调用者未使用前者的返回值时给出警告
196   -Wunused-value              当一个表达式的值未被使用时给出警告
197   -Wunused-variable           有未使用的变量时警告
198   -Wvariadic-macros           指定 -pedantic
199                               时不为可变参数宏给出警告
200   -Wvla                       使用变长数组时警告
201   -Wvolatile-register-var     当一个寄存器变量被声明为 volatile
202                               时给出警告
203   -Wwrite-strings             在 C++
204                               中,非零值表示将字面字符串转换为‘char
205                               *’时给出警告。在 C
206                               中,给出相似的警告,但这种类型转换是符合
207                               ISO C 标准的。
208   -frequire-return-statement  Functions which return values must end with
209                               return statements

 

   3. 编译优化选项

1 -O1    最小化空间 minimize space
 2 -Op[-] 改善浮点数一致性 improve floating-pt consistency
 3 -O2    最大化速度 maximize speed
 4 -Os    优选代码空间 favor code space
 5 -Oa    假设没有别名 assume no aliasing
 6 -Ot    优选代码速度 favor code speed
 7 -Ob    内联展开(默认 n=0) inline expansion (default n=0)
 8 -Ow    假设交叉函数别名 assume cross-function aliasing
 9 -Od    禁用优化(默认值) disable optimizations (default)
10 -Ox    最大化选项。(-Ogityb2 -Gs) maximum opts. (-Ogityb1 -Gs)
11 -Og    启用全局优化 enable global optimization
12 -Oy[-] 启用框架指针省略 enable frame pointer omission
13 -Oi    启用内建函数 enable intrinsic functions