gcc和g++常用编译参数
Posted myonlybook
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(绝对路径), 那么在程序运行的时候,就不会出现动态库明明存在,但是找不到的情况了。
以上是关于gcc和g++常用编译参数的主要内容,如果未能解决你的问题,请参考以下文章
arm-linux-gcc 常用参数讲解 gcc编译器使用方法