Подтвердить что ты не робот

Undefined ссылка на main - collect2: ld возвращен 1 статус выхода

Я пытаюсь скомпилировать программу (называемую es3), но когда я пишу из терминала:

gcc es3.c -o es3

появляется следующее сообщение:

/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

Что я могу сделать?

4b9b3361

Ответ 1

Это означает, что es3.c не определяет функцию main, и вы пытаетесь создать из нее исполняемый файл. Исполняемый файл должен иметь точку входа, поэтому компоновщик жалуется.

Чтобы скомпилировать только объектный файл, используйте параметр -c:

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

Выше компилируется es3.c в объектный файл, затем компилирует файл main.c, который будет содержать функцию main, а компоновщик объединяет es3.o и main.o в исполняемый файл под названием es3.

Ответ 2

Возможно, ваша функция main была закомментирована из-за, например, Предварительная обработка. Чтобы узнать, что делает предварительная обработка, попробуйте gcc -C -E es3.c > es3.i, затем посмотрите с помощью редактора в сгенерированный файл es3.i(и выполните поиск main внутри него).

Во-первых, вы всегда должны (с тех пор, как вы новичок) скомпилировать

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

Флаг -Wall чрезвычайно важен, и вы всегда должны его использовать. Он сообщает компилятору дать вам (почти) все предупреждения. И вы всегда должны слушать предупреждения, то есть исправить файл исходного кода es3.C, пока не получите больше предупреждений.

Флаг -g также важен, поскольку он запрашивает gcc для размещения информации отладки в объектном файле и исполняемом файле. Затем вы можете использовать отладчик (например, gdb) для отладки вашей программы.

Чтобы получить список символов в объектном файле или исполняемом файле, вы можете использовать nm.

Конечно, я предполагаю, что вы используете систему GNU/Linux (и я приглашаю вас использовать GNU/Linux, если вы ее еще не используете).

Ответ 3

Исполняемый файл нуждается в основной функции. См. Ниже приветствие мировой демонстрации.

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

Как вы видите, есть основная функция. если у вас нет этой основной функции, ld сообщит "undefined ссылка на главную"

проверить мой результат:

$ 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! 

используйте $ objdump -t es3.o, чтобы проверить, есть ли основной символ. Ниже мой результат.

$ 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

Ответ 4

Одна из возможностей, о которой не упоминалось до сих пор, заключается в том, что вы, возможно, не редактируете файл, который, по вашему мнению, вы. т.е. ваш редактор может иметь другой cwd, чем вы имели в виду.

Запустите "больше" в файле, который вы компилируете, чтобы проверить, действительно ли у него есть содержимое, которое вы надеетесь. Надеюсь, что это поможет!

Ответ 5

Вы можете просто добавить функцию main для решения этой проблемы. Также как:

int main()
{
    return 0;
}