PCL中RangeImage对象创建导致程序崩溃问题求助
问题场景
Windows系统下使用预编译PCL 1.12.1发布版,IDE为Visual Studio 2019,可视化功能正常,但创建pcl::RangeImage对象时,程序要么陷入无限循环,要么触发abort()终止运行:
- x64调试模式:触发断言失败或无限循环
- x64发布模式:出现
std::vector内存访问错误 - 编译过程无错误警告
最小复现代码:
#include <pcl/range_image/range_image.h> int main () { pcl::RangeImage rangeImage; return 0; }
终止时的断言错误信息:
Assertion failed: (internal::UIntPtr(array) & (31)) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****", file C:\Program Files\Eigen3\include\eigen3\Eigen\src\Core\DenseStorage.h, line 128
核心原因
该错误是Eigen内存对齐检查失败导致的,本质是项目编译配置与预编译PCL的编译配置不匹配:
- 预编译PCL基于启用内存对齐(通常是32字节对齐,对应AVX指令集)的Eigen编译,而你的项目未开启对应对齐选项
- 项目使用的Eigen版本与预编译PCL依赖的Eigen版本不一致,导致头文件和库的对齐逻辑不兼容
解决方案
统一Eigen版本
确保项目中引用的Eigen头文件版本与预编译PCL依赖的Eigen版本完全一致,删除项目中其他版本的Eigen引用,避免版本冲突。开启对应内存对齐编译选项
在VS2019项目属性中配置:- 进入
C/C++ -> 代码生成 -> 启用增强指令集,设置为AVX2(匹配Eigen 32字节对齐要求) - 进入
C/C++ -> 代码生成 -> 结构体成员对齐,设置为默认值或16字节/32字节,不要手动设置为更小的对齐值(如1字节)
- 进入
匹配PCL编译配置
确认下载的预编译PCL版本与项目配置完全匹配:- 对应VS2019版本
- 对应x64平台
- Debug项目使用PCL Debug预编译库,Release项目使用PCL Release预编译库,不要跨配置混用
临时绕过对齐检查(不推荐)
如果上述方案无法快速解决,可在项目预处理器定义中添加EIGEN_DONT_ALIGN或EIGEN_DONT_ALIGN_STATICALLY,强制关闭Eigen的对齐检查,但会降低Eigen运算性能,仅作为临时 workaround。
内容的提问来源于stack exchange,提问作者Tim

