start salida returned referencia pthread_create función estado error devuelto devolvió definir collect2 0x20 c gcc reference

returned - Referencia indefinida a main-collect2: ld devolvió 1 estado de salida



referencia a pow sin definir en c (6)

Estoy tratando de compilar un programa (llamado es3), pero cuando escribo desde la terminal:

gcc es3.c -o es3

aparece este mensaje:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start'': (.text+0x18): undefined reference to `main'' collect2: ld returned 1 exit status

¿Qué puedo hacer?


Archivo ejecutable necesita una función principal. Vea a continuación la demostración de hola mundo.

#include <stdio.h> int main(void) { printf("Hello world!/n"); return 0; }

Como puedes ver hay una función principal. Si no tiene esta función principal, ld informará "una referencia indefinida a main ''"

revisa mi resultado:

$ cat es3.c #include <stdio.h> int main(void) { printf("Hello world!/n"); return 0; } $ gcc -Wall -g -c es3.c $ gcc -Wall -g es3.o -o es3 ~$ ./es3 Hello world!

utilice $ objdump -t es3.o para verificar si hay un símbolo principal. A continuación se muestra mi resultado.

$ objdump -t es3.o es3.o: file format elf32-i386 SYMBOL TABLE: 00000000 l df *ABS* 00000000 es3.c 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l d .debug_abbrev 00000000 .debug_abbrev 00000000 l d .debug_info 00000000 .debug_info 00000000 l d .debug_line 00000000 .debug_line 00000000 l d .rodata 00000000 .rodata 00000000 l d .debug_frame 00000000 .debug_frame 00000000 l d .debug_loc 00000000 .debug_loc 00000000 l d .debug_pubnames 00000000 .debug_pubnames 00000000 l d .debug_aranges 00000000 .debug_aranges 00000000 l d .debug_str 00000000 .debug_str 00000000 l d .note.GNU-stack 00000000 .note.GNU-stack 00000000 l d .comment 00000000 .comment 00000000 g F .text 0000002b main 00000000 *UND* 00000000 puts


En mi caso, descubrí que faltaba el void para la declaración de la función principal.

Anteriormente estaba usando Visual Studio en Windows y esto nunca fue un problema, así que pensé que podría dejarlo ahora también.


Significa que es3.c no define una función main y está intentando crear un ejecutable a partir de ella. Un ejecutable debe tener un punto de entrada, por lo que el vinculador se queja.

Para compilar solo en un archivo objeto, use la opción -c :

gcc es3.c -c gcc es3.o main.c -o es3

Lo anterior compila es3.c en un archivo objeto, luego compila un archivo main.c que contendría la función main , y el enlazador fusiona es3.o y main.o en un ejecutable llamado es3 .


Simplemente puede agregar una función main para resolver este problema. Al igual que:

int main() { return 0; }


Tal vez su función main haya sido comentada debido a, por ejemplo, el preprocesamiento. Para saber qué está haciendo el preprocesamiento, intente gcc -C -E es3.c > es3.i luego busque un editor en el archivo generado es3.i (y busque en su interior).

Primero, debes siempre (ya que eres un novato) compilar con

gcc -Wall -g -c es3.c gcc -Wall -g es3.o -o es3

La bandera -Wall es extremadamente importante, y siempre debes usarla. Le dice al compilador que le dé (casi) todas las advertencias. Y siempre debe escuchar las advertencias, es decir, corregir su archivo de código fuente es3.C hasta que no tenga más advertencias.

El indicador -g también es importante porque le pide a gcc que coloque información de depuración en el archivo objeto y en el ejecutable. Entonces puede usar un depurador (como gdb ) para depurar su programa.

Para obtener la lista de símbolos en un archivo objeto o un ejecutable, puede usar nm .

Por supuesto, estoy asumiendo que usas un sistema GNU / Linux (y te invito a usar GNU / Linux si aún no lo usas).


Una posibilidad que no se ha mencionado hasta ahora es que tal vez no esté editando el archivo que cree que es. es decir, su editor puede tener un cwd diferente al que usted tenía en mente.

Ejecute ''más'' en el archivo que está compilando para verificar que realmente tenga el contenido que espera que tenga. ¡Espero que ayude!