编译选项:
现在我们Makefile中的编译选项有:
-g :可执行程序包含调试信息;(给gdb调试使用)
-O2:该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外
还会采用几乎所有目标配置支持的优化算法,用以提高目标代码的运行速度。也就是增加相应的优化编译选项
-fpic:用于生成位置无关代码。
位置无关码的作用:
1、程序在运行期间动态加载到内存中;
2、程序在不同场合与不同程序组合后加载到内存(一般用于动态链接库)
3、在运行期间不同地址相互之间的映射;(如bootloader)
简言之,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用。
-L.
-L 搜索相应库文件路径,.是指当前路径;
-march=armv7-a
-march=armv7-a是指编译出来的汇编语言是针对armv7架构的;
-mtune=contex-a8
与上面一样,这个则是针对板子上的CPU选项是contex-a8类型的;
-mfloat-abi=softfp
上面的编译选项和-mfloat-abi=hard,这个参数都用来产生硬浮点指令;硬浮点则是通过浮点运算单元(FPU)来完成,使用实际的硬件浮点运算单元会比软浮点快得多;
-mthumb-interwork
这个编译选项则是支持编译出来的汇编语言可以支持ARM和THUMB指令集;
-mno-thumb-interwork
缺省情况下是“-mno-thumb-interwork”,因为指定了“-mthumb-interwork”产生的代码稍微大一些;
-Wno-write-strings:
会忽略掉C++ char * 转const char *的警告,这样并不会很安全;
-Wno-trigraphs
关闭ANSI C的三联符编译出现的错误;
-fno-tree-vectorize
关闭程序中的向量化的选项;如果增加在-O3会默认开启,但我们并没有使用-O3选项;
程序向量化选项的意义网上搜索相应的资料并不多,但总结起来应该就是使用gcc支持将相应的数学公式直接转换成程序代码,提高算法速度。
-fno-inline
忽略代码中的inline关键字,该选项使编译器将内联函数以普通函数正常对待,等同于无优化选项的处理。
-fno-short-enums
-fshort-enums支持给enum类型分配它声明的值域范围的字节数;
enum类型等于大小足够的最小整数类型。
也就是说
typedef enum num{
one = 1,
two = 2,
three = 3,
four = 4,
}NUM;
NUM num1;
sizeof(num1)不增加这个-fshort-enums选项的时候为4,增加后为大小为1;
-fno-short-enums则是无这个选项优化处理。gcc是默认没有-fshort-enums这个选项的;
-Wundef
当一个没有定义的符号出现在 #if 中时,给出警告。
-fexpensive-optimizations
执行各种消耗昂贵的优化技术,但是不一定保证运行时性能能提升,反而可能一定程度上会产生负面影响.
-frename-registers:
在寄存器分配后,通过使用registersleft over来避免预定代码中的虚假依赖。
-fomit-frame-pointer
能够提高程序性能;
原理上最主要的区别是少了栈帧的切换和栈地址的保存;在gdb 执行disassemble命令时,由于没有保存相应栈调用地址,而导致无法追踪函数调用顺序的问题;
-Dstrlcat=strncat
网上没有相关的资料