如何将 Eigen 库安装到 IAR c/c++ 编译器

How to install Eigen library to IAR c/c++ compiler

本文关键字:IAR c++ 编译器 安装 Eigen      更新时间:2023-10-16

是否可以将线性代数的C++模板库Eigen移植到ARM的IAR工作台上。我尝试这样做,但遇到以下编译错误

Error[Pe337]: linkage specification is incompatible with previous "__nounwind __iar_builtin_get_CONTROL" (declared at line 58 of "C:Program Files (x86)IAR SystemsEmbedded Workbench 8.3armincciccarm_builtin.h") C:Program Files (x86)IAR SystemsEmbedded Workbench 8.3armCMSISCoreIncludecmsis_gcc.h 151

这是我使用预处理器时得到的全部错误

__GNUC__
__arm__

如果我不使用这些预处理器,我会从 #error 预处理器收到错误 来自特征文件 Macros.h

"错误请告诉我您的编译器的属性((对齐(n(((的等效项">

#if (defined __CUDACC__)
#define EIGEN_ALIGN_TO_BOUNDARY(n) __align__(n)
#elif EIGEN_COMP_GNUC || EIGEN_COMP_PGI || EIGEN_COMP_IBM || EIGEN_COMP_ARM
#define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))
#elif EIGEN_COMP_MSVC
#define EIGEN_ALIGN_TO_BOUNDARY(n) __declspec(align(n))
#elif EIGEN_COMP_SUNCC
// FIXME not sure about this one:
#define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))
#else
//#define EIGEN_ALIGN_TO_BOUNDARY(n) __declspec(align(n))
#error Please tell me what is the equivalent of __attribute__((aligned(n))) for your compiler
#endif

我让它适用于视觉c ++,但不适用于IAR。添加所有包含项。

这些错误会根据我用来尝试配置特征的预处理器而变化。是否可以将特征与IAR一起使用?

为了补充@chtz答案,以下是我如何让EIGEN_ALIGN_TO_BOUNDARY宏以与特征库一致的方式与 IAR 配合使用:

1:将其添加到 Macros.h 的顶部以标识 IAR ARM 编译器

/// internal EIGEN_COMP_ICCARM set to 1 if the compiler is IAR eWARM
#if defined(__ICCARM__)
#define EIGEN_COMP_ICCARM 1
#else
#define EIGEN_COMP_ICCARM 0
#endif

2:将此情况添加到宏中定义EIGEN_ALIGN_TO_BOUNDARY(n(的位置.h

#elif EIGEN_COMP_ICCARM
#define IAR_STRINGIFY(a) #a
#define IAR_ALIGN_STR(n) IAR_STRINGIFY(data_alignment=n)
#define EIGEN_ALIGN_TO_BOUNDARY(n) _Pragma(IAR_ALIGN_STR(n))

EIGEN_ALIGN_TO_BOUNDARY(n( 现在应该正确扩展到 _Pragma("data_alignment=n"(

我现在已经让它构建和运行。感谢您@chtz EIGEN_DONT_ALIGN宏建议。我就是这样做的。但是,我不确定这对库本身有什么影响,例如这可能会带走哪些功能。我这样做了:

  1. 包括将 Eigen 安装到的目录作为附加包含。
  2. 在文件 DenseStorage.h 的第 86、105、125、145 行中更改行 EIGEN_ALIGN_TO_BOUNDARY(8( T阵列[大小];
    到他们各自的 _Pragma("data_alignment=8"( T 数组[大小];
    (注意数字(
  3. 在 Macros.h 中,第 665 行,注释掉"#error 请告诉我是什么">
  4. 最后,在预处理器设置中定义宏EIGEN_DONT_ALIGN。

这就是对特征3.3.7有效的方法