提问人:Hans 提问时间:11/13/2023 更新时间:11/13/2023 访问量:34
使用 Eigen 编译 PardisoSupport 时遇到问题?
Trouble compiling PardisoSupport with Eigen?
问:
以下是我最近遇到的问题的最低工作示例:
我的源代码:
// main.cc
#define EIGEN_USE_MKL_ALL
#include <Eigen/Sparse>
#include <Eigen/PardisoSupport>
int main() {
Eigen::SparseMatrix<double> sp;
Eigen::PardisoLDLT<Eigen::SparseMatrix<double>> ldlt_solver;
ldlt_solver.compute(sp);
}
而 cmake 文件直接来自官网:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(test)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
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>)
我使用以下代码进行编译:
mkdir build
cd build
cmake ..
make
然后我收到以下编译错误:
/usr/include/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h:50:22: error: cannot convert ‘int*’ to ‘const long long int*’
50 | ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
| ^~~~~~
| |
| int*
我从 Eigen 的官方网站上注意到了这一点:
- 在 64 位系统上,必须使用 LP64 接口(而不是 ILP64 接口)
并认为这可能是导致编译错误的问题。但是,我不知道这会导致什么。我是否需要更改链接或编译选项才能使其正常工作?
我也读过这篇关于stackoverflow的文章,我尝试在包括Eigen之前添加。但我仍然遇到同样的错误。#define EIGEN_DEFAULT_DENSE_INDEX_TYPE long long int
答:
0赞
Hans
11/13/2023
#1
在仔细阅读了 cmake 配置过程的输出后,我意识到可以通过设置为以下方式来解决该问题:MKL_INTERFACE
lp64
MKLConfig.cmake
这是最后的:CMakeLists.txt
# CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(test)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# for 64 bit system
set(MKL_INTERFACE lp64)
find_package(MKL CONFIG REQUIRED)
find_package(Eigen3 3.4.0 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>)
评论