ZPN项目 3:使用 Intel ICX 编译多线程动态运行时pyd的失败记录
使用Pybind11,可以生成供python调用接口的C++动态链接库,该库包含一个符合python启动签名的函数,并以pyd为后缀。
编译生成该库,与生成一般C++库基本一致。特殊地,当采用以下全部配置生成时,程序的调用将失败:
- 使用icx-cl编译器(兼容MSVC编译器标识的 icx 编译器)
- 使用多线程动态运行时标识 /MD
在python解释器中产生的异常信息为:ImportError: DLL load failed: 找不到指定的模块
模块导入异常往往是由于找不到依赖树中的某个模块。然而,通过DependenciesUI的分析,该依赖树中并没有找不到的模块。
下图为笔者分别采用 icx 和 cl 编译器在 /MD 设置下编译生成的pyd库的依赖树:
可见:
- 所有模块均在当前环境路径下可见,并能成功加载。
- 两种编译器产生的依赖树是不同的。
其中,对 kernel32.dll 的二级依赖 ext-ms-win-oobe-query-l1-1-0.dll 失败,但此项为延迟加载,故不会导致上述异常。参见:
- https://learn.microsoft.com/en-us/answers/questions/1195445/kernel32-dll-dependenci-ext-ms-win-oobe-query-l1-1
- https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-apisets#api-set-contract-names
后续的测试计划,用于判断是否此问题与pybind11有关,即:
在C++应用中,引用一个不含pybind11的库,该库采用icx /MD编译,若应用同样产生加载异常,则可排除pybind11的影像。