Rust Win GNU ABI で実際何か作る時は MinGW-w64 の gcc にパスを通しておくのが実質必須と言うお話
今回は Conrod と言う GUI ライブラリのサンプルを動かしてみたくて 試そうとしたら、コンパイルが途中で止まったのが発端。
確認環境
公式ガイドにあるサンプルを動かす Cargo タスクを実行すると外部 Crate のコンパイルで止まった。
cargo run --release --example text
エラーメッセージはもう長くなりすぎるんで省略するけど、
miniz-sys 0.1.7
という Crate のコンパイルで止まっていた。
現象やメッセージがどんなものかと言うのは gcc-rs の issue#7と同じなので 詳しくはそちらをどうぞ。
今回問題の原因は何かと言うと、Cargo は前の記事でもチラッと話題にしたが、
- Cargo にはカスタムビルドスクリプトと言う機能があり、
- Crate によってはそこで更に gcc-rs と言うカスタムビルドスクリプトから C/C++ コンパイラを直接呼ぶ為のライブラリが必要で、
- gcc-rs は Win GNU ABI の場合、MinGW-w64 の gcc に PATH を通している事が必須
と言う事。
ここで一つ疑問なのは Win GNU ABI 版 Rust 同梱の gcc じゃダメなのかと言う事だが *1、 rustc から呼ぶ gcc は主にコンパイル済みライブラリのリンクを目的として使ってて C ソースからコンパイルするにはヘッダファイル等も一緒に入ってないと色々と都合が悪く こういう仕様になってるみたい。Rust 同梱の gcc でも試してみたが確かに動かなかった。 まあ C ソースのコンパイルから必要な Crate だとそうするしかないか。
似たような主旨の事は実は gcc-rs の README にも書かれているんだが、この事は外部 Crate を使わずに何か作るという可能性が低いから 公式でももっと大きく書いておいて欲しいと個人的には思った。 *2
また、リンク先には MSVC 環境の場合もフォローしてるけど自分は GNU ABI でやってるので未確認。
最後に MinGW-w64 の gcc に PATH を通せば最初のコマンドは無事実行できた。
*1:実際 The Programming Language Rust でサンプルコードを試している時は今回の事はなかった→Rust 同梱/MinGW-w64 いずれの gcc にも PATH は通していなかったので
*2:未読のForeign Function Interfaceなどに書いてあったらごめんなさい