Undefined ссылка на "main" в минимальной программе C

Я пытаюсь понять компиляцию C немного глубже, и поэтому я компилирую и связываю "вручную". Вот мой код

int main()
{
    return 0;
}

И вот что я вкладываю в консоль (Windows):

gcc -S main.c
as main.s -o main.o
ld main.o

И при попытке ссылки я получаю:

main.o:main.c:(text+0x7): undefined reference to `__main'

Ответ 1

Вы не связывали ни одну из необходимых библиотек поддержки. C глобальные объекты, такие как stdin, stdout, stderr, не просто появляются из ниоткуда. Аргументы команды и переменные среды вытягиваются из операционной системы. И при выходе все эти функции atexit() вызываются, а код возврата из main передается в exit(return_code). Etc.

Проверьте команды gcc -dumpspecs, gcc -print-libgcc-file-name. Посмотрите на все другие библиотеки этого каталога. Вы найдете много таких библиотек и объектных файлов, на которые ссылается вывод dumpspecs. Я не знаю точно, когда и как эти правила спецификации интерпретируются, но вы, вероятно, можете получить эту идею. И я думаю, что информационные страницы GCC info gcc объясняют это подробно, если вы копаете достаточно далеко.

info gcc, а затем нажмите 'g', а затем введите "Spec Files"

И как сказал Джонатан Леффлер, ярлык должен запустить gcc с подробным вариантом: gcc -v и просто посмотреть, какие команды он использовал.