配置NVCC编译器适配Eigen库:解决C2665编译错误
Eigen 3.4.0 搭配 CUDA 12.0 编译错误解决方法
问题详情
原本可正常运行的 Eigen 3.4.0 项目,安装 CUDA 12.0 后,通过 Visual Studio 编译时,在 Eigen 库的 NumTraits.h 文件触发 C2665 编译错误,出错代码段如下:
struct default_digits10_impl<T,false,false> // Floating point { EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { using std::log10; using std::ceil; typedef typename NumTraits<T>::Real Real; return int(ceil(-log10(NumTraits<Real>::epsilon()))); }
错误提示:“log10”: 没有重载函数可以转换所有参数类型
错误触发场景:初始化如下自定义矩阵类型时:
using CubeXX3d = Eigen::Matrix<Eigen::Vector3d, -1, -1>;
已尝试但无效的方案:
- 在主文件添加以下代码:
#if (defined __GNUC__) && (__GNUC__>4 || __GNUC_MINOR__>=7) #undef _GLIBCXX_ATOMIC_BUILTINS #undef _GLIBCXX_USE_INT128 #endif - 按照 CUDA 与 Eigen 兼容性说明定义
EIGEN_DEFAULT_DENSE_INDEX_TYPE
可行解决办法
- 禁用 Eigen 的 CUDA 支持:如果项目不需要 Eigen 的 CUDA 加速功能,在项目属性的「预处理器定义」中添加
EIGEN_NO_CUDA,强制 Eigen 走纯 CPU 代码路径,避免编译器混淆标准库和 CUDA 数学函数。 - 调整头文件包含顺序:确保项目中先包含标准库头文件(如
<cmath>),再包含 CUDA 和 Eigen 的头文件,让编译器优先识别标准库的log10实现。 - 升级 Eigen 版本:Eigen 3.4.0 对 CUDA 12.0 的兼容性不足,升级到 Eigen 3.4.1 及以上稳定版本,官方已修复部分 CUDA 12.x 相关的编译兼容问题。
- 显式绑定标准库数学函数:在包含 Eigen 头文件前,显式声明
using std::log10; using std::ceil;,确保 Eigen 内部查找时优先匹配标准库的函数重载。
内容的提问来源于stack exchange,提问作者Ekaterina
相关产品推荐
相关产品推荐

