编译Eigen的PardisoSupport组件时遇类型转换错误求助
解决Eigen结合Intel MKL PardisoSupport的编译类型不匹配问题
问题根源
你遇到的int*无法转换为const long long int*错误,本质是Intel MKL的ILP64接口与Eigen PardisoSupport预期的LP64接口不兼容:
- ILP64接口将MKL的整数类型定义为
long long(64位) - Eigen的PardisoSupport实现是针对LP64接口开发的,预期整数参数为
int(32位)
解决方案
通过CMake强制MKL使用LP64接口即可解决,修改你的CMakeLists.txt,添加全局编译定义MKL_LP64:
cmake_minimum_required(VERSION 3.22) project(test) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 关键:强制MKL使用LP64接口,匹配Eigen PardisoSupport的类型要求 add_compile_definitions(MKL_LP64) find_package(Eigen3 3.4.0 REQUIRED) find_package(MKL CONFIG REQUIRED) add_executable(main main.cc) target_link_libraries(main PUBLIC Eigen3::Eigen) target_compile_options(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_COMPILE_OPTIONS>) target_include_directories(main PUBLIC $<TARGET_PROPERTY:MKL::MKL,INTERFACE_INCLUDE_DIRECTORIES>) target_link_libraries(main PUBLIC $<LINK_ONLY:MKL::MKL>)
额外说明
- 你之前尝试的
EIGEN_DEFAULT_DENSE_INDEX_TYPE无效,因为该宏仅控制Eigen内部的索引类型,而问题出在MKL的Pardiso函数接口定义上,与Eigen内部索引无关。 - MKL默认可能会优先使用ILP64接口(尤其是在部分64位系统环境中),显式定义
MKL_LP64会让MKL切换到LP64模式,自动链接对应的LP64版本库文件。
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

