linux下gcc编译选项
(1)c/c++编译过程
编译一个.cpp文件时, 经过处理、编译、汇编和链接 4 个步骤,生成一个可执行程序:
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