项目场景:
需要引用pcl库中的平面拟合功能,项目用cmake构建,平台是在jetson nano上,自带系统是一个ubuntu18.04的阉割版本。
问题描述
其实自己也实现了平面拟合算法,在设计代码的时候是把这部分算法做成接口的,也就是带PCL和不带PCL都可以编译,运行。然后奇怪的问题就来了,不带PCL算法耗时70ms左右,带上PCL算法耗时95ms,问题是平面拟合那一部分调用频率很低,耗时几乎是可以忽略不计的,平白无故增加的25ms非常不合理。
原因分析:
1.考虑是不是PCL库编译的问题,比如编译成Debug了?
由于本身代码使用的是pcl 1.11.1,jetson nano自带的是pcl1.8,为了保持一致我是自己编译了pcl(后面准备整理下交叉编译PCL的教程)。有可能忘记选Release了?然而再三确认,我又编译了一遍,发现不是这个问题,确定就是Release。
2.考虑是导入PCL库的时候带了某些编译设置
打印 CMAKE_CXX_FLGAS_RELEASE 只有O3 NDEBUG两个选项。抱着试一试的心态,make VERBOSE=on,然后对比了带PCL和不带PCL的编译参数,发现了一个符号 -ffloat-store,网上查了一下,浮点数使用前都会存到存储器中,直觉上就是这个原因。由于不知道CMake怎么去掉这个标记,手动在CMakefiles里面改了flags.cmake,把这个标记去掉然后make,果然恢复正常了。
解决方案:
- make VERBOSE=on 对比编译参数
- CMakeFiles中手动修改flags.cmake,去掉-ffloat-store