Mokerの徒然日記2.0

技術系のことをつらつらと。情報に責任は負いません。

OpenCascadeベースの自作 *.pyd モジュールで発生した "Import Error: DLL load failed while importing ***" を解決する

OpenCascadeをベースにCythonで作成した.pydモジュールで発生した"Import Error: DLL load failed while importing **"を解決した流れについて(依存DLL調査など)

前提

OpenCascadeを呼び出すC++ベースのモジュールを作成していたところ,ビルドは通るものの,importを行おうとするとImport Error: DLL load failed while importing ***エラーが発生した.

Software Version
Windows 10
Python 3.10
Cython 0.29.33
OpenCASCADE (OCCT) 7.6.0

依存関係の調査

DependenciesというDLLの依存性確認プログラムを使用する. Releaseからダウンロードして,DependenciesGUI.exeをダブルクリックすることで起動できる.

github.com

*.pydファイルを開き,色々なツリーを見ていくと,エラーが出ているものが見つかる. 今回はtbb.dlltbbmalloc.dllだった.

Dependenciesによる解析結果

TBBの導入 & import成功

調べてみると,TBBというのはインテルの並列処理用ライブラリらしい. しかしながら,GitHub - oneapi-src/oneTBB: oneAPI Threading Building Blocks (oneTBB)のReleaseから最新版をダウンロードしてもtbb.dllは見つからず. そこで,古いバージョンを探したところ,Release Threading Building Blocks 2020 Update 3 · oneapi-src/oneTBB · GitHubにtbb.dll/tbbmalloc.dllの双方が含まれていることを確認した.

OCCT/TBBの双方のdllを*.pydと同じディレクトリに追加したところimportに成功した.

[余談]PythonのDLL配置先について

pybind11 + Mingw-w64 8.1 + Python 3.8 does not work · Issue #2010 · pybind/pybind11 · GitHubIssue 43173: Python Windows DLL search paths - Python trackerによると,Python3.8からセキュリティ上の理由でDLLの読み込み元が変更になったらしい. 具体的には環境変数のPATH内のディレクトリを探索しなくなったとのこと.

配布の際にはwheelの中に入れておくのが良いとう情報が多いような気がした.