Lewati ke konten

Error Rust E0463: can't find crate (crate tidak ditemukan)

E0463 artinya compiler mencari sebuah crate (library) utuh dan pulang dengan tangan kosong. Biasanya kodemu punya baris extern crate untuk crate yang tidak ada di Cargo.toml. Kadang crate yang hilang justru std itu sendiri, yang terjadi kalau kamu mem-build untuk jenis mesin lain dan belum memasang target-nya. Keduanya punya perbaikan cepat, dan kamu tidak perlu paham soal linker untuk menerapkannya. Halaman ini bagian dari Penjelasan error compiler Rust.

error[E0463]: can't find crate for `rand`
--> src/main.rs:1:1
|
1 | extern crate rand;
| ^^^^^^^^^^^^^^^^^^ can't find crate

Compiler bilang ia tidak bisa menemukan crate bernama rand yang diminta di baris 1.

Ini program yang menghasilkan error tersebut, di proyek baru hasil cargo new yang bagian [dependencies]-nya masih kosong:

extern crate rand;
fn main() {
let roll = rand::random_range(1..=6);
println!("You rolled {roll}");
}

Bentuk kedua yang sering muncul sama sekali tidak punya nomor baris, karena tidak ada baris kodemu yang meminta std. Setiap program membutuhkannya:

error[E0463]: can't find crate for `std`
|
= note: the `aarch64-unknown-linux-gnu` target may not be installed
= help: consider downloading the target with `rustup target add aarch64-unknown-linux-gnu`

Di sini compiler bilang target aarch64-unknown-linux-gnu mungkin belum terpasang, dan menyarankan untuk mengunduhnya dengan rustup target add. Kamu mendapatkannya dari cargo build --target aarch64-unknown-linux-gnu (Linux ARM 64-bit, seperti Raspberry Pi) kalau yang terpasang hanya target untuk mesinmu sendiri. Perbaikan mana yang kamu butuhkan tergantung nama crate dan note:-nya:

Yang kamu lihat Biasanya yang salah Perbaikan
can't find crate for `rand` di baris extern crate crate-nya tidak ada di Cargo.toml Perbaikan 1
sama, di kode lama dengan #[macro_use] kode yang ditulis sebelum edisi 2018 Perbaikan 2
can't find crate for `std` + target may not be installed build untuk target yang belum diunduh rustup Perbaikan 3
crate name using dashes are not valid di dekat E0463 ada - di nama crate di dalam kodemu Perbaikan 4

extern crate rand; memberi tahu compiler “sambungkan (link) library yang sudah dikompilasi bernama rand ke program ini”. Compiler tidak mengunduh apa pun dan tidak mencari di internet. Ia hanya melihat library yang diberikan Cargo, dan Cargo hanya memberikan crate yang tercantum di Cargo.toml. Tidak ada rand di sana artinya tidak ada library rand di daftar, jadi muncullah E0463.

Kasus std idenya sama, hanya satu tingkat lebih dalam. Standard library juga library yang sudah dikompilasi, dan rustup memasang satu salinan per target. Toolchain biasamu hanya punya salinan untuk komputermu sendiri. Begitu kamu meminta build untuk ARM, compiler mencari salinan std untuk ARM yang memang tidak ada.

Ibaratnya resep yang bilang “pakai tepung di lemari”. Kalau tidak ada yang membeli tepung, si juru masak tidak bisa mulai, sebagus apa pun resepnya.

Rust tidak punya folder global bersama berisi library yang sudah terpasang, seperti pip install di Python atau node_modules untuk seluruh sistem. Setiap proyek menyebutkan dengan persis apa yang dipakainya di Cargo.toml, lengkap dengan versinya, dan Cargo mem-build crate-crate itu untuk proyek tersebut. Karena itulah proyek yang sama ter-build dengan cara yang sama di laptopmu, di mesin rekan kerjamu, dan di CI. Crate yang tidak ditulis di sana bagi kodemu sama saja tidak ada.

extern crate sebagian besar adalah sisa dari Rust 2015. Sejak edisi 2018, setiap crate di Cargo.toml otomatis tersedia, jadi kode modern cukup menulis use rand::random_range;. Kamu masih akan menemukan extern crate di tutorial lama dan jawaban Stack Overflow, dan dari situlah kebanyakan E0463 berasal. Sekarang, tanpa dependency-nya, baris use akan menghasilkan E0432, dan path di kodemu menghasilkan E0433. Penyebabnya sama, kodenya berbeda.

Lihat Cargo dan crate untuk cara kerja dependency, dan Tool Rust untuk toolchain dan target.

Perbaikan 1: Tambahkan crate-nya dengan cargo add

Section titled “Perbaikan 1: Tambahkan crate-nya dengan cargo add”

Pilih ini kalau crate yang hilang berasal dari crates.io, seperti rand, regex, atau serde_json. Inilah kasus yang paling sering terjadi. Jalankan perintah ini di folder yang berisi Cargo.toml:

Terminal window
cargo add rand

Cargo menambahkan versi terbaru untukmu:

[dependencies]
rand = "0.10.3"

Itu saja sudah memperbaiki E0463. Sekalian, hapus baris extern crate rand;; kamu tidak membutuhkannya di edisi 2018 atau sesudahnya (cek edition = di Cargo.toml). Versi ini mencetak hasil pengecekan, bukan angka lemparannya, supaya output-nya selalu sama:

fn main() {
let roll = rand::random_range(1..=6);
println!("Lemparan ada di antara 1 dan 6: {}", (1..=6).contains(&roll));
}

Output:

Lemparan ada di antara 1 dan 6: true
▶ Coba sendiri

Kode lama mungkin juga memanggil fungsi yang sudah berubah antar versi. Kalau cargo add sudah memperbaiki E0463 tapi kemudian kamu mendapat E0425 atau E0432 untuk sesuatu seperti thread_rng, cek dokumentasi crate untuk versi yang kamu pakai. Lihat Menambahkan dependency dengan cargo add.

Perbaikan 2: Ganti baris extern crate lama dengan use

Section titled “Perbaikan 2: Ganti baris extern crate lama dengan use”

Pilih ini kalau kamu menyalin kode dari sebelum 2018. Kode seperti itu sering diawali blok seperti ini, dan setiap barisnya bisa menghasilkan E0463:

#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize)]
struct Order {
item: String,
qty: u32,
}
error[E0463]: can't find crate for `serde_derive`
--> src/main.rs:2:1
|
2 | extern crate serde_derive;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate
error[E0463]: can't find crate for `serde_json`
--> src/main.rs:3:1
|
3 | extern crate serde_json;
| ^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate

Jangan tambahkan serde_derive sebagai crate terpisah. Sekarang makro derive-nya ikut bersama serde kalau kamu menyalakan feature derive:

Terminal window
cargo add serde --features derive
cargo add serde_json

Lalu hapus blok extern crate itu dan impor yang kamu pakai dengan baris use biasa. #[macro_use] juga tidak diperlukan:

use serde::Serialize;
#[derive(Serialize)]
struct Order {
item: String,
qty: u32,
}
fn main() {
let order = Order { item: String::from("apel"), qty: 3 };
println!("{}", serde_json::to_string(&order).unwrap());
}

Output:

{"item":"apel","qty":3}
▶ Coba sendiri

Kalau sebuah baris extern crate menyebut crate yang sebenarnya tidak pernah dipakai kodemu, hapus saja barisnya. Pelajaran JSON dengan Serde menunjukkan penyiapan modernnya secara lengkap.

Perbaikan 3: Pasang target-nya dengan rustup target add

Section titled “Perbaikan 3: Pasang target-nya dengan rustup target add”

Pilih ini kalau error-nya soal std (atau core) dan note:-nya bilang target-nya mungkin belum terpasang. Salin nama target dari baris help::

Terminal window
rustup target add aarch64-unknown-linux-gnu
rustup target list --installed # cek apa yang sekarang sudah terpasang

Lalu build lagi dengan --target yang sama. Target adalah jenis mesin yang menjadi tujuan kompilasimu, ditulis sebagai “triple” seperti aarch64-unknown-linux-gnu atau wasm32-unknown-unknown. rustup mengunduh std yang sudah jadi untuk target itu, jadi E0463 pun hilang.

Dua catatan. Pertama, untuk banyak target, ini belum langkah terakhir: mem-build program utuh untuk OS lain biasanya juga butuh linker untuk platform tersebut, dan itu error yang berbeda. Kedua, kalau proyeknya punya rust-toolchain.toml, jalankan perintahnya di dalam folder proyek, supaya rustup menambahkan target ke toolchain yang benar-benar dipakai proyek itu. Lihat Komponen dan target dan pelajaran WebAssembly untuk target yang kemungkinan besar akan kamu pakai.

Perbaikan 4: Tulis tanda hubung sebagai garis bawah di kode

Section titled “Perbaikan 4: Tulis tanda hubung sebagai garis bawah di kode”

Pilih ini kalau nama crate-nya mengandung tanda hubung, seperti serde-json atau tracing-subscriber. Di Cargo.toml dan di command line, tanda hubung tidak masalah. Di kode Rust, - adalah tanda minus, jadi nama crate selalu ditulis dengan _. Kode lama yang memakai tanda hubung menghasilkan ini:

error: crate name using dashes are not valid in `extern crate` statements
--> src/main.rs:1:14
|
1 | extern crate serde-json;
| ^^^^^^^^^^ dash-separated idents are not valid
|
help: if the original crate name uses dashes you need to use underscores in the code
|
1 - extern crate serde-json;
1 + extern crate serde_json;
|
error[E0463]: can't find crate for `serde_json`

Artinya: nama crate dengan tanda hubung tidak valid di extern crate, dan di kode kamu harus memakai garis bawah. rustc sudah membaca namanya sebagai serde_json, jadi E0463 di bawahnya hanya muncul kalau crate itu juga tidak ada di Cargo.toml. Di baris use, tanda hubung memberi pesan yang lain, expected one of `::`, `;`, or `as`, found `-` . Perbaikannya sama di mana pun: cargo add crate-nya kalau perlu, dan tulis _ di kode:

use serde_json::json;
fn main() {
let order = json!({ "item": "apel", "qty": 3 });
println!("{order}");
}

Output:

{"item":"apel","qty":3}
▶ Coba sendiri

Aturan yang sama berlaku untuk package-mu sendiri: proyek bernama shop-app diimpor sebagai shop_app dari main.rs dan dari test-nya.

Menjalankan rustc main.rs langsung. rustc sendirian tidak membaca Cargo.toml, jadi bahkan setelah cargo add rand, rustc --edition 2021 src/main.rs tetap bilang can't find crate for `rand` untuk baris extern crate rand; (dan E0432 untuk baris use rand::...). Perbaikannya: build dengan cargo run atau cargo build, yang meneruskan dependency-mu ke compiler.

Crate yang tercantum di [dev-dependencies]. Dev-dependency (ditambahkan dengan cargo add --dev) hanya ada untuk test, contoh, dan benchmark. Memakainya dari kode biasa menghasilkan E0463 dengan extern crate, atau E0433 dengan path. Perbaikannya: pindahkan ke [dependencies] dengan cargo remove --dev serde_json lalu cargo add serde_json.

Board embedded tanpa sistem operasi. Untuk target seperti thumbv7em-none-eabihf, memasangnya saja tidak cukup, karena target itu sama sekali tidak punya std. Catatannya berubah dan menyebutkan hal itu:

error[E0463]: can't find crate for `std`
|
= note: the `thumbv7em-none-eabihf` target may not support the standard library
= note: `std` is required by `shop` because it does not declare `#![no_std]`

Compiler bilang target ini mungkin tidak mendukung standard library, dan shop membutuhkan std karena tidak mendeklarasikan #![no_std]. Perbaikannya: tulis programnya sebagai #![no_std], yang juga berarti tanpa println! dan dengan panic handler buatanmu sendiri. Embedded Rust Book (bahasa Inggris) memandumu langkah demi langkah.

  • E0432: unresolved import (impor tidak ditemukan), yang dihasilkan baris use kalau crate-nya tidak ada di Cargo.toml.
  • E0433: failed to resolve (gagal di-resolve), yang dihasilkan path seperti rand::rng() kalau crate-nya tidak ada.
  • E0603: crate-nya ditemukan, tapi item yang kamu inginkan darinya bersifat privat.
  • crate name using dashes are not valid: error ini tidak punya kode; tulis _, bukan - (Perbaikan 4).
  • Semua error compiler: daftar lengkap halaman error.

Kuis singkat

1. Kode lama diawali extern crate regex; dan kamu mendapat E0463. Apa perbaikan terbaik di proyek edisi 2021?

2. cargo build --target wasm32-unknown-unknown bilang tidak bisa menemukan crate std dan target-nya mungkin belum terpasang. Perintah apa yang kamu jalankan?

3. Cargo.toml-mu berisi tracing-subscriber = "0.3". Bagaimana menulis nama crate itu di kode Rust?

Skor: 0 / 3