编译器优化异常
⑴ PCL编译 SSE优化导致的移植错误 Illegal instruction
自己使用了pcl的程序在自己的电脑上运行正常,但是打包到其他的电脑上运行时报段错误(segmentation fault),然后使用gdb调试的时候,发现类似如下错误点:
无论你使用的是pcl的动态库( *.so )还是静态库( *.a ),就很奇怪:
自行编译pcl的时候,cmake会自动检测机器能进行的优化,然后可能会给编译器加上 -march=native 的编译选项, 进行 SSE 等适合本地机器的优化,能起到加速的作用。
指定了-march参数,gcc将不会再用兼容的指令去编译。
如果只是自己电脑用,没有什么问题,但是如果编译的库还要在其他的电脑上使用,如果其他的机器不具备这些优化的硬件,指令就执行不了,就会报 Illegal instruction 的错误,呈现在上面就是段错误(segmentation fault)
之所以上面的错误在别的电脑上还能知道自己电脑上特定文件的位置呢,因为PCL编译的时候默认的编译类型是 RelWithDebInfo ,这样编译出来的库是有调试信息的,所以能指向特定文件位置。
编译PCL的时候,如果只有自己使用,开启也没有关系,还能加速。
如果是编译公共库或者程序要在其他的机器上运行,建议不要开启SSE优化。
关闭SSE优化后的PCL的库(无论是动态库还是静态库),其他程序依赖之后就不会产生上面的 No such file or directory 的错误。
如果开启了。cmake的时候,中间输出信息中会有 Using CPU native flags for SSE optimization: -march=native 的输出,如下图所示
在PCL源码cmake文件夹下,有个pcl_options.cmake的文件
找到下面的内容。默认第二个时 ON,把它改成 OFF即可
⑵ ARMClang6.1编译优化导致的访问不对齐异常
keil-project-options for target-选项卡c/c++ 左侧中间有个optimization 后面的对应的就是编译优化设置 level 0就是不优化
⑶ 关闭编译器内联优化命令
方法如下:
1、可以通过设置编译器选项亏昌禁止对strcpy、strcat等函数唯迟内联,这样就可以从汇编代码来关闭。
2、在release版本可以选择指空李在配置属性点击C+进行优化。
⑷ Debug模式下怎样去掉编译器的优化解决思路
通常开发的程序有2种模式:Debug模式和Release模式。
在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便程序员测试,以及出现bug时的分析解决。
Release模式下,就没有上述那些调试信息,而且编译器也会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题,就不方便分析测试了。
⑸ 如何防止因编译器开启优化,而导致程序执行错误
我的经验是:未优化的c程序可正常运行,优化后不能运行,那一定是我的程序有问题。我还没经历过不是我程序的情况。
发现这种不易发现的问题,需要看汇编码。
避免的方法,我的经验:写c程序,尽量规矩;似是而非的概念,一定要搞清楚,别侥幸。因为侥幸而留的雷,现在不出问题,将来一定会出问题;不优化不出问题,优化就出问题。
最后要说,每个应用程序,都让他开优化运行,只要时间允许,一定要查出开优化后出问题的原因。时间不允许,只能不开优化凑合着,在有时间的时候继续查问题。