Ir al contenido

Error E0601 de Rust: `main` function not found in crate (falta la función main)

E0601 significa: Rust quería compilar un programa, pero no encontró dónde empieza. Todo programa de Rust comienza en una función que se llama exactamente main, escrita en el nivel superior de src/main.rs. Si falta, está mal escrita o está metida dentro de un módulo, te sale este error. Es muy común cuando copias un fragmento de un tutorial o de la documentación de una biblioteca, y siempre se arregla rápido. (Esta página forma parte de Errores del compilador de Rust explicados.)

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`

En español: “no se encontró la función main en el crate main”. La etiqueta te sugiere añadir una función main a src/main.rs.

Este es el programa que lo produce:

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

El ^ señala el final del archivo, justo después de la última }. Parece raro, pero tiene sentido: rustc leyó todo el archivo buscando fn main y llegó al final sin encontrarla. No hay ninguna línea equivocada a la que señalar; el problema es una línea que no está.

El nombre del crate en el mensaje depende de cómo compiles. Esta salida viene de rustc src/main.rs, así que el crate se llama main, como el archivo. Con cargo run verás en su lugar el nombre de tu paquete en Cargo.toml, por ejemplo `main` function not found in crate `shop`. Es el mismo error, con las mismas soluciones.

Es como el guion de una obra de teatro con escenas geniales pero sin “Acto 1, escena 1”. Los actores están listos, pero nadie sabe dónde empieza la función.

Un binario de Rust (un programa que ejecutas) necesita un único punto de entrada fijo. Cuando arrancas el programa, el sistema operativo llama a main, y todo lo demás ocurre porque main lo llama. Rust no adivina: ni la primera función del archivo, ni una función llamada start, ni Main. El nombre tiene que ser exactamente main, todo en minúsculas, en el nivel superior del crate.

El código que no es un programa por sí mismo, como un conjunto de funciones auxiliares que usa otro código, es una biblioteca (library). Una biblioteca no tiene main y se escribe en src/lib.rs. Muchas veces E0601 significa que el código está bien, pero está en el tipo de crate equivocado. Mira Crates binario y de biblioteca juntos y Empezar con Rust.

Solución 1: Añade una función main (o corrige cómo está escrita)

Sección titulada «Solución 1: Añade una función main (o corrige cómo está escrita)»

Elige esta casi siempre: copiaste funciones de algún sitio, o empezaste a escribir funciones auxiliares y todavía no escribiste main. Añade fn main() y llama a tu código desde ahí:

fn total(prices: &[u32]) -> u32 {
prices.iter().sum()
}
fn average(prices: &[u32]) -> u32 {
total(prices) / prices.len() as u32
}
fn main() { // ✅ el programa empieza aquí
let prices = [250, 199, 1200];
println!("total: {} centavos", total(&prices));
println!("promedio: {} centavos", average(&prices));
}

Salida:

total: 1649 centavos
promedio: 549 centavos
▶ Pruébalo tú mismo

¿Ya tienes una main? Entonces revisa cómo está escrita. fn Main(), fn mian() o fn main_() dan exactamente el mismo E0601, porque para Rust son simplemente otras funciones. El nombre distingue mayúsculas y minúsculas, y tiene que ser una función: fn main(), con los paréntesis.

Elige esta cuando el mensaje dice the main function must be defined at the crate level (la función main tiene que estar definida en el nivel del crate). Tienes una main, pero está dentro de un mod, así que en realidad es app::main, no el punto de entrada del programa:

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

Las note te muestran dónde está la función llamada main y te recuerdan que no está en el nivel del crate; el help te sugiere moverla. El programa que lo produce:

mod app {
pub fn main() { // ❌ inside a module, not at the top level
println!("Starting the shop...");
}
}

Pon la main de verdad en el nivel superior. El código del módulo puede quedarse ahí; dale un nombre más claro, como run, y llámalo desde main:

mod app {
pub fn run() {
println!("Abriendo la tienda...");
}
}
fn main() { // ✅ en el nivel superior de src/main.rs
app::run();
}

Salida:

Abriendo la tienda...
▶ Pruébalo tú mismo

Lo mismo pasa con los módulos en otros archivos: una pub fn main() en src/app.rs es app::main, nunca el punto de entrada. Mira Módulos.

Solución 3: Conviértelo en una biblioteca, si no está pensado para ejecutarse solo

Sección titulada «Solución 3: Conviértelo en una biblioteca, si no está pensado para ejecutarse solo»

Elige esta cuando el código es un conjunto de funciones auxiliares que usa otro código, sin nada que “ejecutar”. Las bibliotecas no tienen main. Crea el proyecto con --lib:

Terminal window
cargo new --lib cart # crea src/lib.rs: una biblioteca, no necesita main
cargo new shop # crea src/main.rs con fn main(): un programa

Pon las funciones auxiliares en src/lib.rs, marca con pub lo que otro código puede usar, y compruébalas con tests en lugar de 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);
}
}

En una biblioteca usa cargo build o cargo test. cargo run no funciona ahí; dice error: a bin target must be available for `cargo run`, que es la forma que tiene Cargo de decir “en este paquete no hay ningún programa”. Si quieres las dos cosas, añade un src/main.rs junto a src/lib.rs. Usa la biblioteca con el nombre del paquete:

src/main.rs
fn main() {
let sum = cart::total(&[250, 199, 1200]);
println!("total: {} cents", sum);
}

Ahora cargo run imprime total: 1649 cents. Mira Crates binario y de biblioteca juntos y Pruebas.

Al pegar un fragmento de la documentación o de un tutorial. Muchos ejemplos muestran solo una función o un struct, no un programa completo. Si los pegas en src/main.rs, dan E0601. Solución: envuelve las líneas que hacen algo en fn main() { ... }, y deja las funciones y los structs fuera. (El Rust Playground se da cuenta de que falta main y te ofrece compilar el código en lugar de ejecutarlo, así que ahí normalmente no verás este error.)

Tu editor marca en rojo la última línea de main.rs. rust-analyzer ejecuta cargo check en segundo plano, así que ves E0601 en la última línea mientras todavía estás escribiendo funciones auxiliares. No pasa nada: la marca desaparece en cuanto añades fn main().

Programas extra en src/bin/. Cada archivo de src/bin/, como src/bin/import.rs, es un programa aparte, y cada uno necesita su propia fn main(). Solución: añade main a ese archivo, o mueve el código compartido a src/lib.rs. Mira el enlace sobre los targets de Cargo más abajo.

Comprueba lo aprendido

1. Tu src/main.rs tiene fn Main() { ... }. ¿Qué dice cargo run?

2. Estás escribiendo funciones auxiliares para que las use otro código, sin nada que ejecutar. ¿Cuál es la configuración correcta?

3. rustc dice "the main function must be defined at the crate level". ¿Qué está mal?

Puntuación: 0 / 3