gcc警告选项汇总
请求或取消警告的选项
警告是诊断消息,报告的结构本质上不是错误的,但是有风险或表明可能有错误。
以下与语言无关的选项不会启用特定的警告,但会控制GCC生成的诊断类型。
-fsyntax-only
检查代码中的语法错误,但除此之外不要做任何事情。
-fmax-errors= n
将错误消息的最大数量限制为n ,此时GCC会缓存,而不是尝试继续处理源代码。 如果n为0(默认值),则生成的错误消息数量不受限制。 如果还指定了-Wfatal-errors ,则重大错误优先于此选项。
-w
禁止所有警告消息。
-Werror
使所有的警告进入错误。
-Werror=
将指定的警告转换为错误。 附加警告的说明符; 例如-Werror =开关将由-Wswitch控制的警告转换为错误。 此开关采用否定形式,用于否定-针对特定警告的错误; 例如-Wno-error =开关使得-wswitch警告不是错误,即使在-Werror有效时也是如此。
每个可控警告的警告消息都包含控制警告的选项。 那么该选项可以与-Werror =和-Wno-error =一起使用 ,如上所述。 (可以使用-fno-diagnostics-show-option标志禁用警告消息中的选项打印。)
请注意,指定-Werror = foo会自动隐含-W foo 。 但是, -Wno-error = foo并不意味着什么。
-Wfatal-errors
此选项会导致编译器在发生第一个错误时中止编译,而不是尝试继续并打印更多错误消息。
例如,您可以使用以“ -W ”开头的选项来请求许多特定的警告 - 可以隐式地请求隐式声明的警告。 这些特定警告选项中的每一个都有一个以“ -Wno- ”开始的否定形式来关闭警告; 例如, -Wno-implicit 。 本手册仅列出两种形式中的一种,无论哪种都不是默认值。 有关其他语言特定的选项,还可以参考C ++ Dialect Options和Objective-C以及Objective-C ++ Dialect Options 。
某些选项(如-Wall和-Wextra )会打开其他选项,例如-Wunused ,这可能会启用其他选项,例如-Wunused-value 。 正面和负面形式的综合作用是,更具体的选项优先于不特定的选项,与命令行中的位置无关。 对于相同特征的选项,最后一个生效。 通过编译指示启用或禁用的选项(请参阅诊断编译指示 )将起作用,就好像它们出现在命令行末尾一样。
当请求无法识别的警告选项时(例如-Wunknown-warning ),GCC将发出诊断,指出该选项未被识别。 但是,如果使用-Wno- form,行为会稍有不同:除非正在生成其他诊断,否则不会生成-Wno-unknown-warning诊断。 这允许在旧编译器中使用新的-Wno-选项,但如果出现问题,编译器会警告存在无法识别的选项。
-Wpedantic
-pedantic
发布严格的ISO C和ISO C ++所要求的所有警告; 拒绝所有使用禁止扩展的程序,以及其他一些不遵循ISO C和ISO C ++的程序。 对于ISO C,遵循由所使用的任何-std选项指定的ISO C标准版本。
有效的ISO C和ISO C ++程序应该在有或没有这个选项的情况下正确编译(尽管极少数需要指定所需版本的ISO C的-ansi或-std选项)。 但是,如果没有这个选项,也支持某些GNU扩展和传统的C和C ++特性。 有了这个选项,他们被拒绝。
-Wpedantic不会导致使用名称以“ __ ”开头和结尾的替代关键字的警告消息。 在__extension__之后的表达式中也禁止了迂腐警告。 但是,只有系统头文件应该使用这些转义路由; 应用程序应该避免它们。 请参阅备用关键字 。
一些用户尝试使用-Wantantic来检查程序是否符合严格的ISO C标准。 他们很快就发现它并没有达到他们想要的水平:它找到了一些非ISO的做法,但不是所有的只有ISO C 需要诊断的那些做法,以及其他一些诊断已经添加了的做法。
报告任何不符合ISO C标准的功能在某些情况下可能会有用,但需要大量额外的工作,并且与-Wantantic完全不同。 我们不打算在不久的将来支持这种功能。
如果用-std指定的标准表示C的GNU扩展方言,如’ gnu90 ‘或’ gnu99 ',则存在相应的基本标准 ,GNU扩展方言所基于的ISO C版本。 -Wpedantic给出的警告在基本标准要求的地方给出。 (这种警告只适用于不在指定的GNU C方言中的功能是没有意义的,因为根据定义,C的GNU方言包括编译器支持的所有功能,并且没有任何可警告的内容。)
-pedantic-errors
在基本标准 (请参阅-Wpedantic )需要诊断时,在编译时存在未定义行为的某些情况下以及在某些其他情况下不会妨碍编译符合标准的有效程序的情况下发出错误。 这不等于-Werror =迂回 ,因为这个选项启用了错误,而后者没有启用,反之亦然。
-Wall
这使得所有关于某些用户认为可疑的构造的警告都很容易避免(或修改以防止警告),即使与宏结合使用也是如此。 这也启用了C ++方言选项和Objective-C和Objective-C ++方言选项中描述的一些特定于语言的警告。
-打开以下警告标志:
-Waddress
-Warray-bounds=1 (only with -O2)
-Wbool-compare
-Wbool-operation
-Wc++11-compat -Wc++14-compat
-Wcatch-value (C++ and Objective-C++ only)
-Wchar-subscripts
-Wcomment
-Wduplicate-decl-specifier (C and Objective-C only)
-Wenum-compare (in C/ObjC; this is on by default in C++)
-Wformat
-Wint-in-bool-context
-Wimplicit (C and Objective-C only)
-Wimplicit-int (C and Objective-C only)
-Wimplicit-function-declaration (C and Objective-C only)
-Winit-self (only for C++)
-Wlogical-not-parentheses
-Wmain (only for C/ObjC and unless -ffreestanding)
-Wmaybe-uninitialized
-Wmemset-elt-size
-Wmemset-transposed-args
-Wmisleading-indentation (only for C/C++)
-Wmissing-attributes
-Wmissing-braces (only for C/ObjC)
-Wmultistatement-macros
-Wnarrowing (only for C++)
-Wnonnull
-Wnonnull-compare
-Wopenmp-simd
-Wparentheses
-Wpointer-sign
-Wreorder
-Wrestrict
-Wreturn-type
-Wsequence-point
-Wsign-compare (only in C++)
-Wsizeof-pointer-div
-Wsizeof-pointer-memaccess
-Wstrict-aliasing
-Wstrict-overflow=1
-Wswitch
-Wtautological-compare
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wvolatile-register-var
CMake指令解析 set(CMAKE_CXX_FLAGS “$ENV{CXXFLAGS} -rdynamic -O3 -fPIC -ggdb -std=c++11 -Wall -Wno-deprec
1、CMAKE_CXX_FLAGS
这种大写的变量,一般都是CMake预定义的内建变量,且他们是全局的。该变量可用于设置编译选项。直接使用set修改其值即可。
除了修改该变量的值之外,还可以通过add_compile_options命令来设置编译选项。它们的区别是:
add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器)
CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器
2、$ENV{}
$ENV{}用于获取环境变量设置环境变量的方法是:
set(ENV{变量名} 值)
1
3、CXXFLAGS
CXXFLAGS是C++编译器的编译选项。
4、-rdynamic
-rdynamic编译选项通知链接器将所有符号添加到动态符号表中。(目的是能够通过使用 dlopen 来实现向后跟踪)
gcc选项-g与-rdynamic的异同
5、-O3
-O3是一个优化选项,告诉编译器优化我们的代码。
gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
6、-fPIC
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码,即,产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
gcc编译参数-fPIC的一些问题
7、-ggdb
-ggdb选项使编译器生成gdb专用的更为丰富的调试信息。
gcc 的 -g 和 -ggdb 选项
8、-std=c++11
-std=c++11设置为使用C++11标准
9、-Wall
-Wall选项告诉编译器 编译后显示所有警告。
gcc中的-w -W和-Wall选项
10、-Wno-deprecated
不要警告使用已弃用的功能
11、-Werror
告诉编译器视所有警告为错误,出现任何警告立即放弃编译
12、-Wno-unused-function
关闭 函数被定义了但没有被使用 而产生的警告,即,不使用的函数不警告。
13、-Wno-builtin-macro-redefined
如果某些内置宏被重新定义,请不要警告。这抑制了警告的重新定义__TIMESTAMP__,TIME,DATE,FILE,和__BASE_FILE__。
14、-Wno-deprecated-declarations
关闭使用废弃API的警告。