7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Rust] VCランタイムライブラリを静的リンクする

Posted at

VCのランタイムライブラリについて

Windows上でMSVCターゲットでビルドした場合、VCランタイムライブラリとリンクされますが、このライブラリには、DLLインポートライブラリと、静的リンク用があります。

デフォルトではDLLインポートライブラリが使用され、ランタイムDLLへの依存関係が発生します。このDLLが中々の曲者で、VisualC++のバージョン毎に存在するため、種類がかなり多いです。

プログラムに対応するバージョンのランタイムがインストールされていない場合、実行時にエラーになります。確実に動作させるには、実行環境にVC++再配布可能パッケージを同時にインストールする必要があります。

ライブラリを静的リンクにした場合、若干EXEファイルのサイズは増えますが、依存関係を気にする必要は無い為、配布の敷居が下がります。しかしながら、DLLインポートしていれば、DLLにセキュリティアップデートがあった場合、Windowsアップデートでの更新が期待出来るので、その辺りはよく考える必要があるかもしれません。

VCランタイム静的リンクの方法

Rustでは、コンパイルオプション "target-feature=+crt-static" により、静的リンクを指定する事が出来ます。

コンパイルオプションを プロジェクトのフォルダ/.cargo/config.toml に記述しておけば、ビルド時にコンパイルオプションが反映されます。

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 だけになったのが確認できます。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?