我面临着一个奇怪的行为的Visual Studio 2019(v 16.5.4),而生产一个python模块链接对英特尔MKL库(2020更新1)。任何帮助将被感激!
要重现它:使用VS2019创建一个小的python模块 "Project1.pyd",其行文如下。
#include <pybind11/pybind11.h>
#include <mkl.h>
void test() {
const MKL_INT m(10);
double test[m*m];
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, m, m, 1., test, m, test, m, 0., test, m);
}
PYBIND11_MODULE(Project1, m) {
m.def("test", &test);
}
这段代码与mkl_rt.lib链接,作为添加的库依赖,以获得cblas_dgemm的定义。然后我用简单的python行调用模块
if __name__ == "__main__":
import Project1 as p
导致 "DLL加载失败。模块未找到
请注意,我能够使用VS2019 16.4.5 Python 3.6运行同样的代码。
可怕的是,编译器或链接器没有任何抱怨:我花了整整三天时间来识别和隔离这个问题,因为它出现在一个大的C++ python库中。
使用 stijn 和 Evg 的建议解决了问题。
1) 使用Dependency(github.comlucasgDependencies)对问题进行了描述:没有找到MKL库--似乎MKL运行时库的目录从19版改成了20版。
2) 要解决这个问题,只需在全局变量PATH中添加MKL运行时库(这里是mkl_core和mkl_intel_thread)。