-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Windowsでテストを実行するとエラーになる #3
Comments
軽く検証。 voicevox_core on main via v3.9.9 via v1.62.1
07:37:06 ❯ cargo test
...コンパイル関係...
Finished test [unoptimized + debuginfo] target(s) in 5m 26s
Running unittests src\lib.rs (target\debug\deps\core-1df1610ef55c3313.exe)
error: test failed, to rerun pass '--lib'
Caused by:
process didn't exit successfully: `E:\voicevox-project\voicevox_core\target\debug\deps\core-1df1610ef55c3313.exe` (exit code: 0xc000007b)
target/debug/deps on main took 1m34s
07:49:14 ❯ .\core-1df1610ef55c3313.exe
target/debug/deps on main took 3s
07:50:31 ❯ $LASTEXITCODE
-1073741701
target/debug/deps on main
07:50:47 ❯ foreach($f in (gci *.dll)) { mv $f ($f -replace ".dll", "_bak.dll") } # 全てのdllをxxx_bak.dllにリネーム
target/debug/deps on main
07:51:06 ❯ cp (gci ../build -r onnxruntime.dll)[0] . # buildディレクトリからonnxruntime.dllを探してコピー
target/debug/deps on main
07:51:09 ❯ .\core-1df1610ef55c3313.exe
...テストが実行される(!)...
test engine::open_jtalk::tests::extract_fullcontext_works::case_2 ... ok
test result: ok. 72 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.39s
target/debug/deps on main took 17s
07:51:28 ❯ $LASTEXITCODE
0 |
@sevenc-nanashi ありがとうございます。 |
こんな感じになりました |
ありがとうございます。 |
|
@y-chan ちなみにこのリポジトリをcloneして |
試してみてみましたが、やはりだめそうでした。
|
@y-chan ありがとうございます。 またログを展開していただいたことにより少々興味深いことがわかりました
|
私もログに |
link-searchは、コンパイルに必要なライブラリのある場所を指定するための仕組みではないでしょうか? DLLは実行時にリンクされます。 1番簡単なのは、やはり実行ファイル(exe)の有るフォルダにDLLを置くことです。 |
自分の環境でもやってみました:
|
path周り気になって、手元のMacでも試してみたのですが、生成されたバイナリたちに動的ライブラリは直接的にリンクされている訳ではなさそうで、テストが成功するMacやLinuxでは で、問題のWindowsはということで、こちらの記事を元に調べたところ、 解決できなかったから怒られているのではなく、誤った解決をしているために怒られている気がします。 |
@shigobu link-searchはstatic linkだけでなく、dynamic libraryを探すpathの環境変数としても使用されることが説明で記載されてます
また https://doc.rust-lang.org/cargo/reference/environment-variables.html#dynamic-library-paths によれば Windows環境ではPATH環境変数に設定されるようです。 実際、このテストに実行をして失敗するのはあたらしいバージョンのWIndowsのようで、CI test でいうとWindows-2019環境だとテストに成功しますのでPATH環境変数に lib_dirのpathが設定されてると思います。 issueに CI test のWindows-2019環境だとテストが成功する、新しいWindowsが原因になっていそうなことを記載しました |
なるほどー |
@y-chan 🤔 これ、 |
@qwerty2501 普通のWindows 11やWindows 10など、他の方の環境でも確認してもらいたいです...! |
@y-chan なるほど!原因の解像度が上がってきました! |
それでdllは読み込めてるような振る舞いだったけどエラーになっていたのか。。。 |
うーん、いろいろ試してましたが、ダメそうでした。 |
🤔 うーん名前変えれば行けるかと思ったんですが とりあえず |
これは憶測になってしまうんですが、おそらく onnxruntime.libの内部に参照するべき dllのfilenameが入っていて、なのでrenameしただけではonnxruntime.dllを強制的に参照するようになってしまうのではないかと思いました。 |
Windows の dll には詳しくないのですが、この予想はおそらく正しいと感じています。 ダウンロード時に dumpbin コマンドで lib ファイルを調査すると、シンボルの情報に、そのシンボルが存在する dll の名前も含まれていて、それが
|
そうなるとやはりdepsにコピーしてあげる必要がありそうですね。 |
現象
Windows上でテストを実行するとこのようなエラーが表示されてテストに失敗してしまう
エラーメッセージが表示されてるのは このあたり だけど原因となっている場所はもっと奥にありそう
dllとうまくリンクできていないことが原因かと思ったが、テストプログラムは起動できているあたり実はリンクできている?
しかし
target/${config}/deps
配下にonnxruntime.dllを配置するとテストに成功できるのでやはり原因はリンク関係か?memo:
CI test上だと Windows-2019環境だと成功するので新しいWindowsでだけ発生する現象っぽい?
原因の調査
リンク先のパスが間違えていないか確認する
lib_dir
がリンク先のディレクトリを設定しているところだが、このディレクトリ配下にちゃんとonnxruntime.dllが存在するか確認する。確認する際はcargo build -vv
と実行すれば[onnxruntime-sys 0.0.23] cargo:rustc-link-search=native=.../onnxruntime-rs/target/debug/build/onnxruntime-sys-0e76df8d55ca7ef0/out/onnxruntime_1.11.1/onnxruntime-linux-x6 4-1.11.1/lib
といったような感じでlink先のディレクトリが表示されるので、これをWindowsでやっってみて、表示されたディレクトリがちゃんと有効かどうか確認する一度Windowsでテストを実行するとエラーになる #3 (comment) により関係なさそうということがわかったcargo test
で失敗した後にtarget/${config}/deps
配下にonnxruntime.dllをコピーした後、target/${config}/deps
にある他のdllを削除してみる。target/${config}/deps
にテストプログラム実行用のexeファイルがあるはずなのでそのファイルを実行して何もせずにcargo test
した場合と同じエラー結果がえられるか確認する一度
cargo test
で失敗した後にPATH に onnxruntimeが配置されたディレクトリを追加した後、target/${config}/deps
に配置されているテストプログラム実行用のexeファイルを実行してみる新しくcargoでcrateを作成し、そのcrateに対して同じく新しくhello world程度の関数が定義されたdllが配置されたディレクトリに対して onnxruntime-sysと同様に
cargo:rustc-link-search
,cargo:rustc-link-lib
でbuild.rs内でリンクするようにし、dllで定義したかんたんな関数を呼び出すコードをテストコードとして記述する。 その状態でcargo test
してみて失敗するかどうか確認するtargetを
x86_64-pc-windows-gnu
にしてcargo test
する。 defaultだとx86_64-pc-windows-msvc
だが、x86_64-pc-windows-gnu
では成功しないか確認してみるrefs VOICEVOX/voicevox_core#213
The text was updated successfully, but these errors were encountered: