【发布时间】:2020-08-22 18:27:36
【问题描述】:
在生成与英特尔 MKL 库(2020 更新 1)链接的 python 模块时,我面临 Visual Studio 2019(v 16.5.4)的奇怪行为。任何帮助将不胜感激!
重现它:使用 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 库中。
【问题讨论】:
-
PATH中是否有 MKL DLL 的路径? -
可能没有找到 MKL dll,或者找到了它们但没有找到它们的依赖项之一。最后的解决方案是正确设置您的 PATH 。使用github.com/lucasg/Dependencies 加载 Project1.pyd 以查看缺少的内容。
-
是的。链接器处于详细模式,并显示调用了 mlk 库: 1> Recherche en cours C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.1.216\windows\mkl\lib\intel64_win\mkl_intel_lp64_dll.lib : 1> cblas_dgemm trouvé 1> Référencé dans Source.obj 1> Chargé mkl_intel_lp64_dll.lib(cblas_dgemm_lp64.obj)
-
这是显示它找到导入库的链接器。这与在运行时查找 dll 不同。
-
你是对的。我添加到路径但没有解决问题。我正在和dependancy walker一起看看发生了什么。
标签: python c++ visual-studio intel-mkl