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小时内删除。
发表评论