Error Rust E0601: `main` function not found in crate (fungsi main tidak ada)
E0601 artinya: Rust ingin membuat sebuah program, tapi tidak menemukan titik awalnya. Setiap program Rust dimulai dari fungsi yang namanya persis main, ditulis di level teratas src/main.rs. Kalau fungsi itu tidak ada, salah ketik, atau terselip di dalam sebuah modul, kamu mendapat error ini. Ini sangat sering terjadi saat kamu menyalin potongan kode dari tutorial atau dokumentasi sebuah library, dan selalu cepat diperbaiki. (Halaman ini bagian dari Penjelasan error compiler Rust.)
Pesan error-nya
Section titled “Pesan error-nya”error[E0601]: `main` function not found in crate `main` --> src/main.rs:7:2 |7 | } // ❌ end of the file, and no `fn main` anywhere | ^ consider adding a `main` function to `src/main.rs`Artinya: fungsi main tidak ditemukan di crate main, dan rustc menyarankan menambahkan fungsi main ke src/main.rs.
Ini program yang menghasilkan error tersebut:
fn total(prices: &[u32]) -> u32 { prices.iter().sum()}
fn average(prices: &[u32]) -> u32 { total(prices) / prices.len() as u32} // ❌ end of the file, and no `fn main` anywhereApa artinya
Section titled “Apa artinya”Tanda ^ menunjuk ke akhir file, tepat setelah } yang terakhir. Kelihatannya aneh, tapi masuk akal: rustc membaca seluruh file untuk mencari fn main, dan sampai di akhir tanpa menemukannya. Tidak ada baris salah yang bisa ditunjuk; masalahnya adalah baris yang tidak ada.
Nama crate di pesan itu tergantung cara kamu mem-build. Output ini berasal dari rustc src/main.rs, jadi crate-nya bernama main, sesuai nama file. Dengan cargo run, yang muncul adalah nama package-mu dari Cargo.toml, misalnya `main` function not found in crate `shop`. Error-nya sama, perbaikannya juga sama.
Ibaratnya naskah drama dengan adegan-adegan hebat, tapi tanpa “Babak 1, Adegan 1”. Para pemainnya sudah siap, tapi tidak ada yang tahu pertunjukannya dimulai dari mana.
Kenapa Rust melakukan ini
Section titled “Kenapa Rust melakukan ini”Sebuah binary Rust (program yang kamu jalankan) butuh satu titik masuk yang pasti. Saat program dijalankan, sistem operasi memanggil main, dan semua yang lain terjadi karena dipanggil dari main. Rust tidak menebak: bukan fungsi pertama di file, bukan fungsi bernama start, bukan Main. Namanya harus persis main, huruf kecil semua, di level teratas crate.
Kode yang bukan program yang berdiri sendiri, seperti sekumpulan fungsi bantu yang dipakai kode lain, adalah sebuah library. Library tidak punya main dan ditulis di src/lib.rs. E0601 sering berarti kodenya sudah benar, tapi berada di jenis crate yang salah. Lihat Crate binary dan library sekaligus dan Mulai dengan Rust.
Cara memperbaikinya
Section titled “Cara memperbaikinya”Perbaikan 1: Tambahkan fungsi main (atau perbaiki ejaannya)
Section titled “Perbaikan 1: Tambahkan fungsi main (atau perbaiki ejaannya)”Pilih ini hampir setiap saat: kamu menyalin fungsi dari suatu tempat, atau kamu mulai menulis fungsi bantu dan belum menulis main. Tambahkan fn main() dan panggil kodemu dari situ:
fn total(prices: &[u32]) -> u32 { prices.iter().sum()}
fn average(prices: &[u32]) -> u32 { total(prices) / prices.len() as u32}
fn main() { // ✅ program dimulai di sini let prices = [250, 199, 1200]; println!("total: {} cents", total(&prices)); println!("average: {} cents", average(&prices));}Output:
total: 1649 centsaverage: 549 centsSudah punya main? Kalau begitu, periksa ejaannya. fn Main(), fn mian(), atau fn main_() semuanya memberi E0601 yang persis sama, karena bagi Rust itu cuma fungsi lain. Namanya peka huruf besar-kecil, dan harus berupa fungsi: fn main(), dengan tanda kurungnya.
Perbaikan 2: Pindahkan main keluar dari modul
Section titled “Perbaikan 2: Pindahkan main keluar dari modul”Pilih ini kalau pesannya bilang the main function must be defined at the crate level (fungsi main harus didefinisikan di level crate). Kamu punya main, tapi letaknya di dalam sebuah mod, jadi sebenarnya itu app::main, bukan titik masuk program:
error[E0601]: `main` function not found in crate `main` --> src/main.rs:5:2 |5 | } | ^ the main function must be defined at the crate level (in `src/main.rs`) |note: here is a function named `main` --> src/main.rs:2:5 |2 | pub fn main() { // ❌ inside a module, not at the top level | ^^^^^^^^^^^^^ = note: you have one or more functions named `main` not defined at the crate level = help: consider moving the `main` function definitionsArtinya: rustc menemukan fungsi bernama main di baris 2, tapi tidak di level crate, dan menyarankan memindahkannya. Program di baliknya:
mod app { pub fn main() { // ❌ inside a module, not at the top level println!("Membuka toko..."); }}Taruh main yang sebenarnya di level teratas. Kode di modul boleh tetap di sana; beri nama yang lebih jelas seperti run, lalu panggil dari main:
mod app { pub fn run() { println!("Membuka toko..."); }}
fn main() { // ✅ di level teratas src/main.rs app::run();}Output:
Membuka toko...Hal yang sama berlaku untuk modul di file lain: pub fn main() di src/app.rs adalah app::main, tidak pernah menjadi titik masuk. Lihat Modul.
Perbaikan 3: Jadikan library, kalau kodenya memang tidak untuk dijalankan sendiri
Section titled “Perbaikan 3: Jadikan library, kalau kodenya memang tidak untuk dijalankan sendiri”Pilih ini kalau kodenya berupa sekumpulan fungsi bantu yang dipakai kode lain, tanpa ada yang perlu “dijalankan”. Library tidak punya main. Buat proyeknya dengan --lib:
cargo new --lib cart # creates src/lib.rs: a library, no main neededcargo new shop # creates src/main.rs with fn main(): a programYang pertama membuat src/lib.rs (library, tanpa main), yang kedua membuat src/main.rs dengan fn main() (program). Taruh fungsi-fungsi bantunya di src/lib.rs, tandai dengan pub apa saja yang boleh dipakai kode lain, dan periksa dengan test, bukan dengan cargo run:
pub fn total(prices: &[u32]) -> u32 { prices.iter().sum()}
#[cfg(test)]mod tests { use super::*;
#[test] fn adds_prices() { assert_eq!(total(&[3, 4]), 7); }}Jalankan cargo build atau cargo test pada library. cargo run tidak bisa dipakai di sana; ia bilang error: a bin target must be available for `cargo run`, cara Cargo mengatakan “tidak ada program di package ini”. Kalau kamu ingin keduanya, tambahkan src/main.rs di sebelah src/lib.rs. File itu memakai library-nya lewat nama package:
fn main() { let sum = cart::total(&[250, 199, 1200]); println!("total: {} cents", sum);}Sekarang cargo run mencetak total: 1649 cents. Lihat Crate binary dan library sekaligus dan Testing.
Di mana biasanya kamu melihatnya
Section titled “Di mana biasanya kamu melihatnya”Menempelkan potongan kode dari dokumentasi atau tutorial. Banyak contoh hanya menunjukkan sebuah fungsi atau struct, bukan program utuh. Kalau ditempel ke src/main.rs, hasilnya E0601. Perbaikannya: bungkus baris-baris yang melakukan sesuatu dengan fn main() { ... }, dan biarkan fungsi dan struct di luarnya. (Rust Playground menyadari kalau main tidak ada, dan menawarkan untuk mem-build kodenya saja tanpa menjalankannya, jadi di sana biasanya kamu tidak melihat error ini.)
Editormu menandai baris terakhir main.rs dengan warna merah. rust-analyzer menjalankan cargo check di latar belakang, jadi kamu melihat E0601 di baris terakhir selagi masih menulis fungsi bantu. Itu tidak masalah: tandanya hilang begitu kamu menambahkan fn main().
Program tambahan di src/bin/. Setiap file di src/bin/, seperti src/bin/import.rs, adalah program tersendiri, dan masing-masing butuh fn main() sendiri. Perbaikannya: tambahkan main ke file itu, atau pindahkan kode yang dipakai bersama ke src/lib.rs. Lihat tautan Cargo Targets di bawah.
Error terkait
Section titled “Error terkait”- E0425: cannot find value in this scope: nama yang salah ketik di bagian lain program, misalnya memanggil
totl(). - E0433: failed to resolve:
main.rstidak menemukan sebuah modul atau crate library-nya, misalnyacart::totaldengan nama package yang salah. - E0603: item is private:
mainmenemukan fungsi library-nya, tapi fungsi itu tidakpub. - E0463: can’t find crate: crate yang kamu
usetidak ada diCargo.toml. - Semua error compiler: daftar lengkap halaman error.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. src/main.rs-mu berisi fn Main() { ... }. Apa kata cargo run?
2. Kamu menulis fungsi bantu untuk dipakai kode lain, tanpa ada yang perlu dijalankan. Apa susunan yang tepat?
3. rustc bilang "the main function must be defined at the crate level". Apa yang salah?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- E0601 — Rust error codes index (bahasa Inggris): penjelasan resmi error ini.
- Hello, World! — The Rust Book (bahasa Inggris): fungsi
mainpertamamu, dan kenapa setiap program dimulai di sana. - Packages and Crates — The Rust Book (bahasa Inggris): crate binary vs crate library,
src/main.rsvssrc/lib.rs. - Cargo Targets — The Cargo Book (bahasa Inggris): library, binary,
src/bin/, dan cara Cargo menemukan masing-masing. - Main functions — The Rust Reference (bahasa Inggris): aturan persis untuk
main, termasuk di mana ia boleh didefinisikan.