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
Что я могу сделать?
Ответы
Ответ 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;
}