Rustの、Tcl/Tkラッパーである「tcl」と「tk」クレートをWindowsでビルドしようとしたら、libclangが見つからないなど、いろいろなエラーが出て、解決が難しかったので、ここにメモしておきます。
再現するかのテスト
まず、WindowsのRustで、ActiveTclをインストールした後で、ターミナルから、Tcl/Tkのラッパーをインストールして、ビルドするだけでlibclangが見つからないというエラーが出ます。
# Tcl/Tkをラップするクレートのインストール
cargo add tcl tk
# ビルドを実行
rust build
次のようなエラーです。
thread 'main' panicked at 'Unable to find libclang: "couldn't find any valid shared libraries matching: ['clang.dll', 'libclang.dll'] …
前提条件ですが...
- Windows版のRust(ネイティブコンパイラ)を使用している
-
rustup -v
で見ると、1.27.1 であるが、もっと低いバージョンでも同じエラーが出ている- rustup 1.27.1 (54dd3d00f 2024-04-24)
-
rustup show
で見ると、stable-x86_64-pc-windows-msvc (default)
が選択されている
エラーの原因は?
そして、エラーメッセージからいろいろ調べてみると、最新版のRustのLLVMのバージョンがうまくマッチしていないのが原因?のようです。
ChocolateyでLLVMの最新版をインストールすると解決するというヒントを見つけました。
直接的な解決策
Chocolatey (https://chocolatey.org/) をインストールして、管理者権限でPowerShellを起動して以下のコマンドを実行します。
choco install llvm
その後、cargo run
を実行すると、正しくビルドが行われました。
「stdio.hがない」とエラーが出る場合
以下のようにstdio.h
がないというエラーが出る場合があります。
thread 'main' panicked at 'bindgen builder constructed.: ClangDiagnostic(
… fatal error: 'stdio.h' file not found\n")
この場合、Visual Studioをインストールして、「C++によるデスクトップ開発」にチェックを付けてインストールする必要があります。
その他 Tcl/Tkのパスの問題
また、本家Rustのtkクレートの情報によると、ActiveTclのインストール先をデフォルトでインストールする必要があるようです。
-
インストール先を以下にしなくてはならない
実行ファイルが、以下のパスにあること
C:\ActiveTcl\bin\wish.exe
-
上記を実行して、バージョンが表示されること
% info patchlevel
表示された!
問題なくTcl/Tkのビルドがうまくいって、適当なサンプルをビルド売ると、下記のように表示されます。
まとめ
Rustの中だけで全てが解決する場合は、ビルドにそれほど問題がないのですが、C++で作ったライブラリをリンクしようと思う場合には、環境の構築などのそれなりにノウハウが必要となるようです。