由编译器编译参数引起扩展整理

原因

由cv组那边算法, 导入qt时性能整整有十倍之差. 然后vs打开pro文件分析对比, 发现cv组vs编译, 里面有个属性Optimization 设置 /O2最大速度设置。Qt creator原生态编译默认采用 /Od 不进行优化编译, 所以这就导致了跑起来性能效果明显差别。

解决

C++手动开启O2优化
HMI-19-[Qt Release深度优化编译]开启-O优化编译

刚开始我增加编译参数就行了, 结果还是太天真了。
在编译的时候你会发现
在这里插入图片描述
虽然提示/O2 override with /Od ,但是cl 编译命令的时候 还是/Od

最后听大佬说: msvc可能需要这样用/O2,-O2是gcc的写法

QMAKE_CXXFLAGS_RELEASE -= /O
QMAKE_CXXFLAGS_RELEASE -= /O1
QMAKE_CXXFLAGS_RELEASE -= /O2
QMAKE_CXXFLAGS_RELEASE -= /O3
QMAKE_CXXFLAGS_RELEASE -= /Od
QMAKE_CXXFLAGS_RELEASE += /O2

最后结果:用vs2015打开该pro Optimization默认就是/O2
在这里插入图片描述实际效果也的确明显。

然后无聊的时候, 分析了下cl, 下面整理两篇博客
常用cl编译命令参数解释
MSVC编译器编译参数说明
Compiling a C/C++ project

/c 代表只编译不链接。

/I 指定头文件的目录

/C 在编译期间保留代码注释,这里和/I连在一起使用,/IC

首先介绍一个概念,VC中有个PDB文件,全称是Program Database,用来存放程序信息的小的数据库文件。

编译Debug版本时,调试信息需要保留,我们可以选择直接将调试信息写到.obj文件中,或者存到.pdb文件中。

/Z7 不产生.pdb文件,将所有调试信息存入.obj文件中

/Zi和/ZI 都产生.pdb文件,不过/ZI支持"编辑继续调试"功能, (the edit and continue feature), 看上去更酷,但是我从来没有用过这个功能。

/ZI有一些边际效应,会禁止#pragma optmize 指令,也不能和/clr一起用。

/nologo- 已经无效,自己生成命令行的时候,没必要用了。

/W3 也中警告级别,VC提供了很多警告级别,参考http://msdn.microsoft.com/en-us/library/vstudio/thxezb7y.aspx

自己编译的话,直接用/Wall最好。

/WX- 不太明白为什么有 - 号,(估计是和:NO的意思相同,也就是不启用该功能), /WX的意思是将warning转变成error,这样强迫消除所有的warning,如果和/Wall一起使用,那是最好的。

/sdl 是对代码进行安全检查,如果发现相关警告,转变成错误输出

/Od 禁止优化

/Oy- 禁止该选项,该选项如果没有 - 号,则会在x86上编译时忽略frame-pointer,起到加速程序的作用。 frame-pointer,我暂时不知道是啥。

/D 预处理定义,后面可以跟不同的参数都是宏啊,比如

 

/D WIN32 /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE  

/Gm 启用最小化重新编译, VC用.idb保留了上次编译的缓存信息,包括文件依赖关系。下次编译时可以使用.idb文件用来检查,跳过不需要重新编译的文件。

 

/EH 异常处理模式,后面可以接一些参数:http://msdn.microsoft.com/en-us/library/vstudio/1deeycx5.aspx

通常都用/EHsc

/RTC 运行时错误检查,参考:http://msdn.microsoft.com/en-us/library/vstudio/8wtf2dfz.aspx

/MDd 和上面一个都很重要,使用Debug版本的多线程运行时动态库,参考:http://msdn.microsoft.com/en-us/library/vstudio/2kzt1wy3.aspx

/GS 缓冲区安全检查

 

看到这里,发现cl其实参数很多很多,VC提供了默认的选项,一般都够用。不过仔细分析一下,还是能够对cl的特性了解不少,对于提高编译器的认识还是很有好处的。

/fp:precise 是和浮点数相关,参考:http://msdn.microsoft.com/en-us/library/vstudio/e7s85ffb.aspx

/Zc:wchar_t 指定wchar_t是native type,我现在还不不清楚有什么作用。

/Zc:forScope用/Ze来实现标准C++for循环, /Ze已经被废除,所以这个选项似乎没什么意义。

/Yc "stdafx.h" 制定stdafx.h为预编译头文件

/Fp"Debug\HelloWorld.pch" 指定预编译文件, 这样staafx.h编译出的内容放在HelloWorld.pch中,可以大大提高编译速度。因为VC中的预编译文件很大,每次重新编译很耗时。

/Fo"Debug\\" 指定.obj文件存放在Debug目录下

/Fd"Debug\vc110.pdb" 指定pdb文件路径,pdb前面已经介绍过了。

/Gd 仅用于x86平台。如果C++函数没有显示指定__stdcall或者__fastcall,就采用__cdecl

/Tp 指定C++源文件

/analyze- 这是关闭代码分析功能

/errorReport:prompt 提示内部错误信息

/D "WIN32" /D "_DEBUG"  预处理器定义 (即预定义宏)

/ZI 调试信息格式:用于“编辑并继续”的程序数据库

/W3 警告等级

/WX- 不将警告视为错误
/WX   将警告视为错误

/sdl- 不进行SDL检查
/sdl  进行SDL检查

/MDd 多线程调试(使用msvcrtd.lib 动态运行库)
/MTd 多线程调试(使用libcmtd.lib 静态运行库)
/MD
/MT

/Gd 调用约定

/NOLOGO 取消显示启动版权标志

/MANIFEST 生成清单

/DEBUG 生成调试信息

/MACHINE:X86 目标计算机:32/MACHINE:X64 目标计算机:64/INCREMENTAL 启用增量链接

拓展

WINWhere did WIN32_LEAN_AND_MEAN come from

windows 这么解释:

In the Windows.h header, if WIN32_LEAN_AND_MEAN is not defined, the preprocessor will includes other headers.
So if you want to not include theses headers, you must define WIN32_LEAN_AND_MEAN before #include , else it won't have any effects
1: 因为要包含尽量精简的内容,包含了这一句编译的时候明显快多了。
2:不加载MFC所需的模块。如果你的工程不使用MFC,就加上这句,这样一来在编译链接时,包括最后生成的一些供调试用的模块时,速度更快,容量更小。
3:我想这个不是 MFC 特有的, WIN32_LEAN_AND_MEAN 是针对 Win32 相关的头文件的, 比如在包含 WIN32/MFC SDK 头文件之前定义些宏, 可以通过预处理来关闭掉一些不太常用的系统接口或参数, 这样可以加快编译的速度!你可以看看 Windows.h 文件里和 WIN32_LEAN_AND_MEAN 相关的部分就明白了, 另外在这个文件开始部分一个注释, 这里有很多更详细的控制开关()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值