Что происходит в терминале при вводе:

$ gcc main.c

Ну, если у вас нет файла main.c в вашем текущем рабочем каталоге, вы, вероятно, получите сообщение об ошибке. :)

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

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

Первым шагом в процессе компиляции является препроцессор. Препроцессор C — это макропроцессор, который «расширяет» ваш исходный код. Ваш исходный код, вероятно, будет включать некоторые заголовочные файлы «.h», возможно, некоторые макросы и, возможно, некоторые константы. Препроцессор заменит ваш #include <some_header.h> код содержимым заголовочных файлов, а ваши макросы и константы - их фактическими значениями. Еще один дополнительный шаг, который делает препроцессор, — это определение и отсеивание ненужных условных ветвей.

Теперь у нас, вероятно, есть очень длинный файл с кучей исходного кода C внутри него. Помните, что хотя у нас может быть только 1 или 2 файла заголовков в нашем исходном коде, эти файлы заголовков могут также включать в себя несколько файлов заголовков. Так что этот файл становится очень длинным быстро. Чтобы просмотреть копию этого файла, вы можете просто сделать:

$ gcc -E main.c

Вторым шагом в процессе компиляции является компилятор. Компилятор переведет исходный код C на язык ассемблера. Эти файлы обычно заканчиваются на «.s». Эти файлы обычно не создаются для просмотра. Если вы хотите просмотреть этот файл, просто:

$ gcc -S main.c

Выходной файл будет сохранен в main.s.

Переведенный на ассемблер код затем передается в ассемблер для преобразования ассемблерного кода в объектный код или машинный язык. Этот файл также содержит информацию, которую компоновщик может использовать для выполнения своей работы.

Эти файлы обычно заканчиваются на «.o» или «.obj». Чтобы просмотреть этот файл, вы можете:

$ gcc -c main.c

Последним шагом является компоновщик, который свяжет группу объектных файлов в один исполняемый двоичный файл. Двоичные исполняемые файлы обычно не имеют специального суффикса в операционных системах Unix, но могут иметь «.exe» в Windows.

В Unix a.out — это имя выходного файла по умолчанию для исполняемых файлов, когда пользователь не указывает выходное имя. Запустите исполняемый файл и посмотрите, что на терминале отображается стандартный вывод!

$ ./a.out

Спасибо за чтение!