Rust / Cargoでerror[E0463]: can't find crateを修正する方法

beginner🦀 Rust2026-03-21| Rust(全バージョン)、Cargo、Linux / macOS / Windows

Error Message

error[E0463]: can't find crate
#rust#cargo#crate#dependency

表示されているエラー

use文またはextern crate行を追加してcargo buildを実行すると、次のようなエラーが表示されます:

error[E0463]: can't find crate for `serde`
 --> src/main.rs:1:5
  |
1 | use serde::Deserialize;
  |     ^^^^^ can't find crate

または、組み込みやno_stdコードを書いている場合:

error[E0463]: can't find crate for `std`

原因は主に3つあります。クレートがCargo.tomlに記載されていない。名前のスペルが間違っている。またはビルド環境が壊れているかターゲットが不足している。以下の手順を順番に試してください — ほとんどの場合はステップ1または2で解決します。

ステップ1 — まずCargo.tomlを確認する

Cargo.tomlを開き、[dependencies]セクションを確認してください。クレートが記載されていない場合、Cargoはダウンロードもリンクもできません。それだけのことです。

[dependencies]
# クレートはここに記載されていますか?
serde = "1"

記載がない場合は、1つのコマンドで追加できます(Cargo 1.62以降が必要):

cargo add serde

serdetokioaxumなどの人気クレートの多くは、実際に使用する機能を有効にするためにフィーチャーフラグが必要です:

cargo add serde --features derive
cargo add tokio --features full

追加後、Cargo.tomlにエントリが追加されたことを確認し、再ビルドします:

cargo build

ステップ2 — クレート名が正確かどうか確認する

クレート名はcrates.ioではハイフン(-)を使いますが、Rustソースコード内ではアンダースコア(_)を使います。この見落としがちな違いが頻繁に問題を引き起こします。

  • Cargo.toml内:my-crate = "0.1"
  • Rustソース内:use my_crate::SomeStruct;
# Cargo.toml
[dependencies]
my-crate = "0.1"
// src/main.rs
use my_crate::SomeStruct;  // underscore, not hyphen

Cargo.tomlのタイポ — 1文字でも間違えると — Cargoは何もダウンロードせず、コンパイラがエラーを出します。次のステップに進む前に、crates.ioで正確なスペルを確認してください。

ステップ3 — クレートインデックスとロックファイルを更新する

Cargo.lockは、特にCargo.tomlを手動編集した後に同期がずれることがあります。強制的に更新します:

cargo fetch
cargo build

まだ解決しない場合は、問題のあるクレートだけを更新します:

cargo update -p serde

またはすべてのロックを削除してCargoに新しく解決させます:

cargo update

ステップ4 — 正しいワークスペースメンバーにいることを確認する

ワークスペースにはルートのCargo.tomlと個別のメンバークレートがあります。各メンバーは独自の依存関係を管理します — ルートは自動的に共有しません。

# workspace root Cargo.toml
[workspace]
members = ["app", "lib"]

エラーがapp/src/main.rsから発生している場合は、ルートではなくapp/Cargo.tomlを確認してください。そして、そのパッケージを明示的にターゲットにします:

cargo build -p app

ステップ5 — Rustエディションとextern crateの使用を確認する

Rust 2015ではすべての場所で明示的なextern crate宣言が必要でした。Rust 2018以降はその要件がなくなり、useを直接書くだけでよくなりました。2021プロジェクトに残っている2015スタイルの宣言が混乱を引き起こします。

Cargo.tomledition = "2021"と記載されている場合は、次のような行を削除してください:

extern crate serde; // remove this

代わりにこのように書きます:

use serde::Deserialize;

現在もextern crateが必要なケースは、proc-macroクレートとextern crate alloc;のような特殊なno_stdの使用に限られます。

ステップ6 — no_stdの場合:can't find crate for std

ファームウェアやWebAssemblyを書いていてcan't find crate for 'std'が表示される場合、コンパイルターゲットに標準ライブラリがありません。クレートルートの先頭に#![no_std]を追加し、stdの代わりにcoreを使用します:

#![no_std]

use core::fmt;
use core::mem;

またはstdが必要な場合は、正しいターゲットがインストールされているか確認します:

# List installed targets
rustup target list --installed

# Add a target that includes std
rustup target add x86_64-unknown-linux-gnu

ステップ7 — 他の方法で解決しない場合はRustツールチェーンを再インストールする

破損したツールチェーン — 多くの場合rustup updateの途中中断が原因 — により、コンパイラがstdcoreallocを完全に見失うことがあります。まれですが発生します。アンインストールしてクリーンに再インストールします:

rustup toolchain uninstall stable
rustup toolchain install stable
rustup component add rustfmt clippy

次に、ビルドキャッシュを削除して最初からやり直します:

cargo clean
cargo build

検証 — 修正が正常に機能したか確認する

クリーンビルドを実行し、重要な出力だけをフィルタリングします:

cargo build 2>&1 | grep -E "error|warning|Compiling"

正常なビルドは次のようになります:

   Compiling serde v1.0.210
   Compiling my-project v0.1.0
    Finished dev [unoptimized + debuginfo] target(s) in 3.42s

error[E0463]の行がなければ、クレートが見つかってリンクされています。

クイックリファレンス — よくある原因と対処法

  • Cargo.tomlにクレートがないcargo add <crate-name>を実行する
  • クレート名のタイポ → crates.ioで確認してスペルを修正する
  • フィーチャーフラグが不足しているcargo add tokio --features full
  • ロックファイルが古いcargo fetchまたはcargo updateを実行する
  • ワークスペースメンバーが違う → 各メンバー自身のCargo.tomlを確認する
  • エディションの不一致 → 2018以降のエディションでは古いextern crate行を削除する
  • no_stdターゲット#![no_std]を追加するかrustupで正しいターゲットをインストールする
  • ツールチェーンが破損しているrustup toolchain uninstall stable && rustup toolchain install stable

Related Error Notes