Lewati ke konten

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.)

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` anywhere

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.

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.

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 cents
average: 549 cents
▶ Coba sendiri

Sudah 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 definitions

Artinya: 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...
▶ Coba sendiri

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:

Terminal window
cargo new --lib cart # creates src/lib.rs: a library, no main needed
cargo new shop # creates src/main.rs with fn main(): a program

Yang 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:

src/lib.rs
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:

src/main.rs
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.

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.

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