VCのランタイムライブラリについて
Windows上でMSVCターゲットでビルドした場合、VCランタイムライブラリとリンクされますが、このライブラリには、DLLインポートライブラリと、静的リンク用があります。
デフォルトではDLLインポートライブラリが使用され、ランタイムDLLへの依存関係が発生します。このDLLが中々の曲者で、VisualC++のバージョン毎に存在するため、種類がかなり多いです。
プログラムに対応するバージョンのランタイムがインストールされていない場合、実行時にエラーになります。確実に動作させるには、実行環境にVC++再配布可能パッケージを同時にインストールする必要があります。
ライブラリを静的リンクにした場合、若干EXEファイルのサイズは増えますが、依存関係を気にする必要は無い為、配布の敷居が下がります。しかしながら、DLLインポートしていれば、DLLにセキュリティアップデートがあった場合、Windowsアップデートでの更新が期待出来るので、その辺りはよく考える必要があるかもしれません。
VCランタイム静的リンクの方法
Rustでは、コンパイルオプション "target-feature=+crt-static" により、静的リンクを指定する事が出来ます。
コンパイルオプションを プロジェクトのフォルダ/.cargo/config.toml に記述しておけば、ビルド時にコンパイルオプションが反映されます。
[build]
rustflags = ["-C", "target-feature=+crt-static"]
もしくは、
# for MSVC 32bit
[target.i686-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
# for MSVC 64bit
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
config.toml の配置できる場所は色々あるようですが、公式のドキュメントを確認してください。
ビルドしたEXEファイルの比較
Hello Worldを静的リンクオプション有り無しでそれぞれビルドして、EXEファイルのサイズとDLLの依存関係を比較してみます。依存関係の確認は、Dependencies を使用しました。
【オプション無し(ファイルサイズ: 152kb)】
【オプション有り(ファイルサイズ: 244kb)】
依存関係が kernel32.dll だけになったのが確認できます。