编译选项含义

编译选项:

现在我们Makefile中的编译选项有:

-g :可执行程序包含调试信息;(给gdb调试使用)

-O2:该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外

还会采用几乎所有目标配置支持的优化算法,用以提高目标代码的运行速度。也就是增加相应的优化编译选项,具体看下面的相应链接;

https://www.zhihu.com/question/27090458

-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的三联符编译出现的错误;

三联符的概念:

http://blog.csdn.net/daheiantian/article/details/6095507

-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

网上没有相关的资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python内置函数eval()用法及其安全问题

Python内置函数eval()用来对表达式进行求值: >>> eval('3+5') 8 >>> a = 3 >>> b = 5 >>> eval('a+b'...

5439
来自专栏C/C++基础

Google C++编程风格指南(一)之头文件的相关规范

一个良好的编程规范和风格是一名程序猿成熟的标志。规范的编码可以减少代码冗余,降低出错概率,便于代码管理和代码交流等等,事实上,其作用远不止这些,我们要牢记编码规...

951
来自专栏惨绿少年

Shell编程基础篇-上

1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层...

1790
来自专栏FreeBuf

oclhashcat:离线hash密码破解工具官方文档(中文版)

无聊中,就把hashcat的官方文档稍微翻译了下,方便初学的朋友查看。至于oclhashcat,它是一个离线的hash密码破解工具,与hashcat不同,它支持...

4137
来自专栏逸鹏说道

Python3 与 C# 扩展之~模块专栏

代码裤子:https://github.com/lotapp/BaseCode/tree/maste

985
来自专栏老九学堂

从Hello World说程序运行机制

学习任何一门编程语言,都会从Hello World 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的Hello World。然而,对于Hel...

3638
来自专栏Java帮帮-微信公众号-技术文章全总结

第一天 Java基础入门【悟空教程】

2127
来自专栏逸鹏说道

Python3 与 C# 扩展之~模块专栏

代码裤子:https://github.com/lotapp/BaseCode/tree/maste

1605
来自专栏玄魂工作室

安全杂谈——linux通配符绕过文件名黑名单

linux shell下可以通过正则匹配来匹配相应的程序并且执行。 在linux下输入man 7 glob命令可以查看相关的内容。值得注意的就这些,学过正则的一...

702
来自专栏前端儿

RequireJS 模块化加载框架使用

同样的,首先是下载好 require.js --> http://requirejs.org/docs/download.html#requirejs

611

扫码关注云+社区