linux下gcc编译选项
(1)c/c++编译过程
编译⼀个.cpp⽂件时,经过处理、编译、汇编和链接 4 个步骤,⽣成⼀个可执⾏程序:
gcc编译过程
1. 预处理:将(include)的⽂件插⼊原⽂件中、将宏定义展开、根据条件编译命令选择要使⽤的代码
2. 编译:将预处理得到的源代码⽂件,进⾏“翻译转换”,⽣成汇编代码(编译阶段要检查代码的规范性、是否有语法错误,如函数、变量是否被声明等)
3. 汇编:将汇编代码翻译成了机器码,表现为⼆进制⽂件
4. 链接:将汇编⽣成的.o⽂件及其他函数库⽂件链接起来,⽣成能在特定平台上运⾏的可执⾏程序(在链接程序时,链接器会在所有的⽬标⽂件中寻函数的实现。如果不到,那到就会报链接错误码(Lin
kerError))
(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结尾
linux下gcc编译的四个步骤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
84long”给出警告
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
101false even though the expression can't actually
102throw
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
152for __attribute__((const))
153  -Wsuggest-attribute=noreturn 当函数可能是 __attribute__((noreturn))
154的备选时给出警告
155  -Wsuggest-attribute=pure    Warn about functions which might be candidates
156for __attribute__((pure))
157  -Wsurprising                对“可疑”的构造给出警告
158  -Wswitch                    当使⽤枚举类型作为开关变量,没有提供
159default分⽀,但⼜缺少某个case
160时给出警告
161  -Wswitch-default当使⽤枚举类型作为开关变量,但没有提供“default”分⽀时给出警告162  -Wswitch-enum当使⽤枚举类型作为开关变量但⼜缺少某个
163case时给出警告
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
209return 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。