できない.dev

Rust の cargo build で「linker link.exe not found」が解決できない

Windows の既定ツールチェーンは MSVC のリンカーを使うため、Visual Studio Build Tools が入っていないとリンク段階で落ちる。
C++ ビルドツールを入れるか、GNU ツールチェーンへ切り替えるかの二択で解決する。

公開:

要約

error: linker "link.exe" not found は、コンパイルではなくリンクの段階で出るエラーです。

Windows 版の Rust は既定で x86_64-pc-windows-msvc ターゲットを使い、最後のリンクを Microsoft のリンカー(link.exe)に任せます。
rustup はこのリンカーを同梱しないため、Visual Studio 側のビルドツールが無い端末では必ずここで止まります。

Rust 自体の入れ直しでは直りません。
リンカーを用意するか、リンカーを必要としないツールチェーンに切り替えるかのどちらかです。

よくある原因

  1. Visual Studio も Build Tools も入っていない。
    新しい端末で rustup だけ入れたときの定番です。
  2. Build Tools のインストーラーは実行したが、ワークロードを選ばずに閉じた。
    インストーラーは既定で何も選ばないため、本体だけ入って link.exe は入りません。
  3. インストール直後の古いターミナルでそのまま cargo build した。PATH の変更は新しいプロセスにしか反映されません。
  4. ネット上の手順が GNU ツールチェーン前提だった。
    MinGW-w64 を入れても、MSVC ターゲットのままでは link.exe を探し続けます。

解決策

1. C++ ビルドツールを入れる(推奨)

rustup の公式ドキュメントが案内している標準的な手順です。
Visual Studio Build Tools のインストーラーを起動し、ワークロードから C++ によるデスクトップ開発 を選びます。
個別コンポーネントとしては、MSVC のビルドツールと Windows SDK の 2 つが必要です。

インストールが終わったらターミナルを開き直し、リンカーが見えるか確認します。

where.exe link.exe
cargo build

Visual Studio 本体を使っている場合は、同じワークロードが入っていれば追加のインストールは要りません。

2. GNU ツールチェーンへ切り替える

MSVC を入れられない環境では、GNU ツールチェーンに切り替える手もあります。
この場合は MinGW-w64 の gcc がリンカーの役目を果たします。

rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu
cargo clean
cargo build

ただし GNU ツールチェーンは、MSVC 向けにビルドされたクレートやシステムライブラリとの相性で別の問題が出ることがあります。
配布物を Windows で動かすのが目的なら、MSVC 側を整えるほうが結局は近道です。

3. いま使っているターゲットを確認する

どちらのツールチェーンで動いているのかは、次のコマンドの host 行で分かります。

rustc --version --verbose

host: x86_64-pc-windows-msvc と出ていれば MSVC、...-windows-gnu なら GNU です。
切り替えたつもりで切り替わっていない、という取り違えはここで潰せます。

4. 切り替え後は cargo clean を挟む

ツールチェーンを変えると成果物の形式も変わります。target/ に前のターゲットの中間生成物が残っていると、リンク段階で不可解な失敗をすることがあるため、切り替え直後は cargo clean を一度実行しておくと余計な回り道をせずに済みます。

この記事は役立ちましたか?