Неопределенная ссылка на main - collect2: ld вернула 1 статус выхода - PullRequest
39 голосов
/ 01 ноября 2011

Я пытаюсь скомпилировать программу (называемую 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

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

Ответы [ 6 ]

49 голосов
/ 01 ноября 2011

Это означает, что 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.

13 голосов
/ 01 ноября 2011

Возможно, ваша 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 голосов
/ 15 ноября 2015

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

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

2 голосов
/ 01 ноября 2011

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

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

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

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

$ 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
1 голос
/ 26 августа 2018

В моем случае я обнаружил, что void для объявления основной функции отсутствует.

Раньше я пользовался Visual Studio в Windows, и это никогда не было проблемой, поэтому я подумал, что могу и сейчас об этом забыть.

0 голосов
/ 27 марта 2016

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

int main()
{
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...