我的任务是将 Eigen 引入一个使用 IAR 构建的嵌入式项目,该项目将在 STM32 MCU 上运行。
由于 Eigen 版本 3.4 中的 cmake 文件中的各种编译器检查 - 这些检查似乎不适用于 IAR 工具链 - 我被迫从 gitlab 克隆 master,其中这些检查已被删除。
我的克隆的 SHA 是 ff174f79264d3f8dc0115dea7a288f98208b694f。
因此,以下问题很可能是由于使用开发版本造成的。
当我尝试构建这个示例时,出现构建错误。
internal::stable_norm_kernel(SegmentWrapper(copy.segment(bi, numext::mini(blockSize, n - bi))), ssq, scale,
^
"E:\Projects\xxx\third_party\eigen\Eigen\src\Core\StableNorm.h",77 Error[Ta121]:
Auto variable "<unnamed>" cannot have a stricter alignment than the
stack
我在本征码的其他部分也遇到了相同的错误。一个这样的反复出现的例子是
Matrix<Scalar, SmallPanelWidth, SmallPanelWidth, LhsStorageOrder> triangularBuffer(a);
^
"E:\Projects\xxx\third_party\eigen\Eigen\src\Core\products\TriangularMatrixMatrix.h",122 Error[Ta121]:
Auto variable "triangularBuffer" cannot have a stricter alignment
than the stack
我不知道这意味着什么,但我怀疑这可能是我的构建配置错误。 有人可以推动我朝正确的方向前进或建议尝试一些事情吗?
使用预处理器标志
EIGEN_MAX_ALIGN_BYTES
,您可以控制可以对齐的对象数量。如果使用 -DEIGEN_MAX_ALIGN_BYTES=0
进行编译,对齐将被完全禁用。
对于受支持的编译器,应自动设置此标志,但您的工具链似乎不受支持。
您可以在
Eigen 的预处理器指令列表中搜索包含
ALIGN
的任何标志,以更好地控制应对齐的内容(动态对齐可能确实有效,但无论如何它可能对您的平台没有好处)。