Lỗi bạn đang gặp phải
Bạn đã thêm câu lệnh use hoặc dòng extern crate, chạy cargo build, và nhận được thông báo lỗi như sau:
error[E0463]: can't find crate for `serde`
--> src/main.rs:1:5
|
1 | use serde::Deserialize;
| ^^^^^ can't find crate
Hoặc nếu bạn đang viết code nhúng hoặc no_std:
error[E0463]: can't find crate for `std`
Thường có ba nguyên nhân gây ra lỗi này. Crate chưa được khai báo trong Cargo.toml. Tên crate bị viết sai. Hoặc môi trường build bị lỗi hay thiếu target. Hãy thực hiện các bước dưới đây theo thứ tự — hầu hết các trường hợp được giải quyết ở Bước 1 hoặc 2.
Bước 1 — Kiểm tra Cargo.toml trước tiên
Mở Cargo.toml và xem phần [dependencies]. Nếu crate chưa có trong đó, Cargo không có cách nào tải xuống hoặc liên kết nó. Đơn giản vậy thôi.
[dependencies]
# Crate của bạn có được liệt kê ở đây không?
serde = "1"
Chưa có? Thêm vào bằng một lệnh duy nhất (yêu cầu Cargo 1.62+):
cargo add serde
Nhiều crate phổ biến — serde, tokio, axum — cần khai báo feature flags để mở khóa các tính năng bạn thực sự dùng:
cargo add serde --features derive
cargo add tokio --features full
Sau khi thêm, xác nhận mục đã xuất hiện trong Cargo.toml, rồi build lại:
cargo build
Bước 2 — Xác minh tên crate hoàn toàn chính xác
Tên crate dùng dấu gạch ngang (-) trên crates.io, nhưng dùng dấu gạch dưới (_) trong mã nguồn Rust. Sự không khớp âm thầm này khiến nhiều người mắc bẫy liên tục.
- Trong
Cargo.toml:my-crate = "0.1" - Trong mã nguồn Rust:
use my_crate::SomeStruct;
# Cargo.toml
[dependencies]
my-crate = "0.1"
// src/main.rs
use my_crate::SomeStruct; // dấu gạch dưới, không phải gạch ngang
Một lỗi đánh máy trong Cargo.toml — dù chỉ một ký tự sai — có nghĩa là Cargo không tải xuống gì cả và trình biên dịch sẽ báo lỗi. Kiểm tra kỹ chính tả trên crates.io trước khi tiếp tục.
Bước 3 — Làm mới index crate và lock file
Cargo.lock có thể bị mất đồng bộ, đặc biệt sau khi chỉnh sửa thủ công Cargo.toml. Ép làm mới lại:
cargo fetch
cargo build
Vẫn còn lỗi? Cập nhật riêng crate đang gây vấn đề:
cargo update -p serde
Hoặc xóa toàn bộ lock file và để Cargo giải quyết lại từ đầu:
cargo update
Bước 4 — Đảm bảo bạn đang ở đúng thành viên workspace
Workspace có một Cargo.toml gốc và các crate thành viên riêng biệt. Mỗi thành viên quản lý dependencies của riêng mình — root không tự động chia sẻ chúng.
# workspace root Cargo.toml
[workspace]
members = ["app", "lib"]
Nếu lỗi xuất phát từ app/src/main.rs, hãy kiểm tra app/Cargo.toml, không phải root. Sau đó chỉ định rõ package cần build:
cargo build -p app
Bước 5 — Kiểm tra Rust edition và cách dùng extern crate
Rust 2015 yêu cầu khai báo extern crate tường minh ở khắp nơi. Rust 2018 trở lên đã bỏ yêu cầu đó — bạn chỉ cần viết use trực tiếp. Các khai báo theo phong cách 2015 còn sót lại trong project 2021 sẽ gây nhầm lẫn.
Nếu Cargo.toml của bạn có edition = "2021", hãy xóa các dòng như:
extern crate serde; // xóa dòng này
Và thay bằng:
use serde::Deserialize;
Trường hợp duy nhất vẫn cần extern crate hiện nay là các proc-macro crate và một số trường hợp đặc biệt với no_std như extern crate alloc;.
Bước 6 — Trường hợp no_std: can't find crate for std
Đang viết firmware hoặc WebAssembly và thấy lỗi can't find crate for 'std'? Target biên dịch của bạn không có thư viện chuẩn. Thêm #![no_std] vào đầu crate root và chuyển từ std sang core:
#![no_std]
use core::fmt;
use core::mem;
Hoặc, nếu bạn vẫn muốn dùng std, hãy kiểm tra xem target phù hợp đã được cài chưa:
# Liệt kê các target đã cài
rustup target list --installed
# Thêm target có hỗ trợ std
rustup target add x86_64-unknown-linux-gnu
Bước 7 — Cài lại Rust toolchain nếu mọi cách đều không hiệu quả
Toolchain bị hỏng — thường do rustup update bị gián đoạn — có thể khiến trình biên dịch mất dấu std, core và alloc hoàn toàn. Hiếm gặp, nhưng vẫn xảy ra. Gỡ cài đặt và cài lại sạch sẽ:
rustup toolchain uninstall stable
rustup toolchain install stable
rustup component add rustfmt clippy
Sau đó xóa cache build và bắt đầu lại từ đầu:
cargo clean
cargo build
Xác nhận — kiểm tra bản sửa lỗi đã hoạt động
Chạy clean build và lọc output theo những gì quan trọng:
cargo build 2>&1 | grep -E "error|warning|Compiling"
Một lần build thành công trông như thế này:
Compiling serde v1.0.210
Compiling my-project v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 3.42s
Không còn dòng error[E0463] nào. Crate đã được tìm thấy và liên kết thành công.
Tham khảo nhanh — nguyên nhân phổ biến và cách khắc phục
- Crate chưa có trong Cargo.toml → chạy
cargo add <crate-name> - Viết sai tên crate → kiểm tra trên crates.io, sửa lại chính tả
- Thiếu features flag →
cargo add tokio --features full - Lock file cũ → chạy
cargo fetchhoặccargo update - Sai thành viên workspace → kiểm tra
Cargo.tomlcủa từng thành viên - Edition không khớp → xóa các dòng
extern cratecũ cho edition 2018 trở lên - Target no_std → thêm
#![no_std]hoặc cài target phù hợp bằngrustup - Toolchain bị hỏng →
rustup toolchain uninstall stable && rustup toolchain install stable

