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をダブルクリックすることで起動できる.
*.pydファイルを開き,色々なツリーを見ていくと,エラーが出ているものが見つかる.
今回はtbb.dll
とtbbmalloc.dll
だった.
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 · GitHubやIssue 43173: Python Windows DLL search paths - Python trackerによると,Python3.8からセキュリティ上の理由でDLLの読み込み元が変更になったらしい. 具体的には環境変数のPATH内のディレクトリを探索しなくなったとのこと.
配布の際にはwheelの中に入れておくのが良いとう情報が多いような気がした.