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的影像。

posted @ 2023-11-06 10:04  崩溃侠  阅读(127)  评论(0编辑  收藏  举报
友情链接: Heroius' Ideas 沈阳因斯福环保安全科技有限公司 东北大学工业爆炸防护研究所