gcc和g++常用编译参数

-w -W -Wall

  -w 关闭编译警告。平时编写c/c++代码如果不规范,编译的时候会抛出很多警告。但是一般的警告都是可以忽略的,比如类型转换。编译的时候可以加-w关闭警告

  -W 也是关闭编译警告,但是比-w智能一些,它只会显示编辑器认为会出错的警告

  -Wall, 显示所有警告。

  比如下面的代码,test.c

  

  gcc -o a.out test.c -Wall,   把所有的警告都显示出来了,没有使用的变量i,在void函数返回了double。

  

  gcc -o a.out test.c -W, 只显示了编译器认为会出错的警告, 没有使用变量i的那个警告编译器认为不会出错,所以没有输出。

  

  gcc -o a.out test.c -w,  屏蔽了所有警告,只输出错误

  

 

-g   -g3

  gcc 支持4中级别的调试信息,-g0表示不生成调试信息,-g3表示生成最多的调试信息。-g默认为-g2。一般的调试信息包括行号,函数,外部变量。-g3包含其他额外的调试信息,比如宏定义。

 

-O1 -O2 -O3 -Os

  -O系列选项主要用于优化代码。

  -O和-O1是等价的,不影响编译速度,并且会采用一些优化算法,降低代码大小并提高代码运行速度。

  -O2,会降低编译速度,但是除了包含-O1的优化算法之外,还会采用一些其他的优化算法来提高代码运行速度。

  -O3,除了包含-O2所有的优化外,会采取一些向量化算法,提高代码的并行执行程度,使之更充分地利用现代cpu的流水线和cache。

  -Os,-O3即使是增加代码的大小,也要提高运行速度。而这个选项在-O2的基础上,尽量减少目标的大小,这个经常用于存储量比较小的设备。

 

-fno-strict-aliasing

  当优化级别在-O2即以上时,strict-aliasing会被采用。 编译器会假设代码中没有强制转换,从而会使用更加激进的优化算法对代码进行优化。也就是说,代码中如果存在类似于下面的代码就会出错:

    int num = 1.0;

    double *p = (int *)(&num);

  所以当优化级别在-O2及以上时,应该使用-fno-strict-aliasing关闭strict-aliasing。如果可以确保代码中不存在类似于上述的代码,那就不要关闭。据mysql的worklog描述,代码优化速度还是很可观的。

 

-fPIC和-shared

  编译动态库时常用的两个选项。fPIC告诉编译器编译与地址无关的代码(position independent code)。代码中涉及到的地址都是相对地址,绝对地址运行时通过GOT计算得到。-shared告诉编译器编译的是一个动态库。如果没有-shared,编译器会以找不到main函数而失败返回。

 

-wl,-rpath=...

  如果一份代码使用了自己编写的动态库,而且没有放在运行时查找动态库的默认路径中。在这台机器上编译,换个目录执行,就会报找不到动态库的错误。编译时使用的-L选项只是在程序链接成可执行文件时候用的,程序启动时候仍然会发生找不到库的情况。如果编译的时候这样: -wl, -rpath=path_of_lib(绝对路径), 那么在程序运行的时候,就不会出现动态库明明存在,但是找不到的情况了。

  

 

posted @ 2018-08-23 22:19  Frogjie  阅读(1792)  评论(0编辑  收藏  举报