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.)
El mensaje de error
Sección titulada «El mensaje de error»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` anywhereQué significa
Sección titulada «Qué significa»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.
Por qué Rust hace esto
Sección titulada «Por qué Rust hace esto»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.
Cómo solucionarlo
Sección titulada «Cómo solucionarlo»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 centavospromedio: 549 centavos¿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.
Solución 2: Saca main del módulo
Sección titulada «Solución 2: Saca main del módulo»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 definitionsLas 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...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:
cargo new --lib cart # crea src/lib.rs: una biblioteca, no necesita maincargo new shop # crea src/main.rs con fn main(): un programaPon 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:
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:
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.
Dónde lo verás normalmente
Sección titulada «Dónde lo verás normalmente»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.
Errores relacionados
Sección titulada «Errores relacionados»- E0425: cannot find value in this scope: un nombre mal escrito en otra parte del programa, por ejemplo llamar a
totl(). - E0433: failed to resolve:
main.rsno encuentra un módulo o el crate de la biblioteca, por ejemplocart::totalcon un nombre de paquete equivocado. - E0603: item is private:
mainencontró la función de la biblioteca, pero no espub. - E0463: can’t find crate: un crate que usas con
useno está enCargo.toml. - Todos los errores del compilador explicados
Comprueba lo que aprendiste
Sección titulada «Comprueba lo que aprendiste»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
Para leer más
Sección titulada «Para leer más»- E0601 — Rust error codes index (en inglés): la explicación oficial de este error.
- Hello, World! — El libro de Rust (en inglés): tu primera función
main, y por qué todo programa empieza ahí. También existe una traducción al español de la comunidad del libro. - Packages and Crates — El libro de Rust (en inglés): crates binarios frente a crates de biblioteca,
src/main.rsfrente asrc/lib.rs. - Cargo Targets — The Cargo Book (en inglés): bibliotecas, binarios,
src/bin/y cómo encuentra Cargo cada uno. - Main functions — The Rust Reference (en inglés): las reglas exactas de
main, incluido dónde se puede definir.