IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    linux GCC编译和使用方法(二)

    cjhust发表于 2014-11-19 16:10:26
    love 0

    3、百科全书

    gcc 提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:

    -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat

    -Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration

    -Wcomment -Wformat -Wmain (only for C/ObjC and unless

    -ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses

    -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point

    -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1

    -Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)

    -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value

    -Wunused-variable

    unsused

    unused-function:警告声明但是没有定义的static函数;

    unused- label:声明但是未使用的标签;

    unused-parameter:警告未使用的函数参数;

    unused-variable:声明但 是未使用的本地变量;

    unused-value:计算了但是未使用的值;

    format:printf和scanf这样的函数中的格式字符串的使用不当;

    implicit-int:未指定类型;

    implicit-function:函数在声明前使用;

    char- subscripts:使用char类作为数组下标(因为char可能是有符号数);


    missingbraces:大括号不匹配;

    parentheses:圆括号不匹配;

    return-type:函数有无返回值以及返回值类型不匹配;

    sequence-point:违反顺序点的代码,比如 a[i] = c[i++];


    switch:switch语句缺少default或者switch使用枚举变量为索引时缺少某个变量的case;

    strict- aliasing=n:使用n设置对指针变量指向的对象类型产生警告的限制程度,默认n=3;只有在-fstrict-aliasing设置的情况下有效;

    unknow-pragmas:使用未知的#pragma指令;

    uninitialized:使用的变量为初始化,只在-O2时有效;


    -Wall中不会激活的警告选项:

    cast-align:当指针进行类型转换后有内存对齐要求更严格时发出警告;

    sign-compare:当使用signed和unsigned类型比较时;

    missing-prototypes:当函数在使用前没有函数原型时;

    packed:packed 是gcc的一个扩展,是使结构体各成员之间不留内存对齐所需的空 间 ,有时候会造成内存对齐的问题;


    padded:也是gcc的扩展,使结构体成员之间进行内存对齐的填充,会造成结构体体积增大;

    unreachable-code:有不会执行的代码时;

    inline:当inline函数不再保持inline时 (比如对inline函数取地址);

    disable-optimization:当不能执行指定的优化时。(需要太多时间或系统 资源);

    备注:可以使用 -Werror时所有的警告都变成错误,使出现警告时也停止编译,需要和指定警告的参数一起使用;


    优化选项

    gcc默认提供了5级优化选项的集合:

    -O0:无优化(默认);

    -O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化,在编译大型程序的时候会显著增加编译时内存的使用;

    -O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化,编译器不执行循环展开以及函数内联,此选项将增加编译时间和目标文件的执行性能;

    -Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O优化选项,并且执行专门减小目标文件大小的优化选项;

    -O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项;


    常用选项

    --help:显示 gcc 帮助说明;

    --target-help:显示目标机器特定的命令行选项;

    --version :显示 gcc 版本号和版权信息;

    -o outfile :输出到指定的文件;

    -x language :指明使用的编程语言。允许的语言包括:c c++ assembler none 。 ‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言;

    -v :打印较多信息,显示编译器调用的程序;

    -### :与 -v 类似,但选项被引号括住,并且不执行命令;

    -E :仅作预处理,不进行编译、汇编和链接;

    -S :仅编译到汇编语言,不进行汇编和链接;

    -c :编译、汇编到目标代码,不进行链接;

    -pipe :使用管道代替临时文件;

    -combine :将多个源文件一次性传递给汇编器;


    其他选项

    -s :去除可执行文件中的符号表和重定位信息,用于减小可执行文件的大小;

    -M :告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系,对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 #include引用的所有文件。生成的规则可以是单行,但如果太长,就用\+换行符续成多行,规则显示在标准输出,不产生预处理过的C程序;

    -C :告诉预处理器不要丢弃注释,配合-E选项使用;

    -P :告诉预处理器不要产生`#line'命令,配合-E选项使用;

    -static :在支持动态链接的系统上,阻止连接共享库;

    -nostdlib :不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器;


    Warnings

    -Wall :会打开一些很有用的警告选项,建议编译时加此选项;

    -Werror :把警告当作错误,出现任何警告就放弃编译;

    -W /-Wextra :打印一些额外的警告信息;

    -w :禁止显示所有警告信息;

    -Wshadow :当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告,很有用的选项,建议打开(-Wall 并不会打开此项);

    -Wpointer-arith :对函数指针或者void *类型的指针进行算术操作时给出警告,很有用(-Wall 并不会打开此项);

    -Wcast-qual :当强制转化丢掉了类型修饰符时给出警告(-Wall并不会打开此项);

    -Waggregate-return :如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。

    -Winline :无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告(如果你的代码含有很多 inline 函数的话,这是很有用的选项);

    -Wunreachable-code :如果编译器探测到永远不会执行到的代码,就给出警告,也是比较有用的选项;

    -Wcast-align :一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告;

    -Wundef :当一个没有定义的符号出现在 #if中时,给出警告;

    -Wredundant-decls :如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别;


    -fsigned-char 和-funsigned-char:把char定义为有/无符号类型,如同signed char/unsigned char;

    -fsigned-bitfields 和-funsigned-bitfields:如果没有明确声明signed或unsigned修饰符,这些选项用来定义有符号位域或无符号位域,缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数;

    -Wstrict-prototypes :如果函数的声明或定义没有指出参数类型,编译器就发出警告,很有用的警告;

    -Wmissing-prototypes :如果没有预先声明就定义了全局函数,编译器就发出警告,即使函数定义自身提供了函数原形也会产生这个警告,这个选项的目的是检查没有在头文件中声明的全局函数;

    -Wnested-externs :如果某extern声明出现在函数内部,编译器就发出警告;

    -fsigned-char 和-funsigned-char:把char定义为有/无符号类型,如同signed char/unsigned char;

    -fsigned-bitfields 和-funsigned-bitfields:如果没有明确声明signed或unsigned修饰符,这些选项用来定义有符号位域或无符号位域,缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数;

    -Wstrict-prototypes :如果函数的声明或定义没有指出参数类型,编译器就发出警告,很有用的警告;

    -Wmissing-prototypes :如果没有预先声明就定义了全局函数,编译器就发出警告,即使函数定义自身提供了函数原形也会产生这个警告,这个选项的目的是检查没有在头文件中声明的全局函数;

    -Wnested-externs :如果某extern声明出现在函数内部,编译器就发出警告;

    4、参考资料

    关于64位机指针返回前截短问题:

    http://xianguo.com/article/4B3BF2183BF2CDA66D38A4754F6EC302

    http://blog.chinaunix.net/uid-22725463-id-2463488.html

    Linux系统平台下关于GCC编译及使用的方法:

    http://blog.csdn.net/zhenwenxian/article/details/6099314

    http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html



沪ICP备19023445号-2号
友情链接