Что такое компилятор?
Компилятор — это компьютерная программа, которая переводит написанную программу на одном языке программирования на другой. Обычно вторым языком является машинный язык.
Машинный язык — это набор данных, которые компьютер способен понять и интерпретировать. «Двоичный код», состоящий из значений 0 и 1
Во время разработки «Машина», Программист должен был использовать серию двоичных комбинаций, чтобы диктовать приказы, будучи сам переводчиком, вскоре после этого подумали, использовалась ли одна и та же машина для перевода собственного кода? С этим пришли так называемые «Компиляторы».

На этот раз речь пойдет о компиляторе gcc — GNU.
gcc — интегрированный компилятор проекта GNU для языков C, C++, Objective C и Fortran; Он способен получать исходную программу на любом из этих языков и генерировать двоичную исполняемую программу на языке машины, на которой она должна работать.
Акроним GCC расшифровывается как «Коллекция компиляторов GNU». Первоначально это означало «Компилятор GNU C»; GCC по-прежнему используется для обозначения компиляции в C++. G++ относится к компиляции в C++.

Синтаксис.

gcc [опция | архив ] …
g++ [ вариант | архив ] …

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

Опции.
- C
Выполняет препроцессинг и компиляцию, получаю файл в объектном коде; Не связывает.
- E
Выполняет только предварительную обработку, отправляя результат на стандартный вывод.
-o файл
Указывает имя выходного файла, независимо от того, какие шаги были выполнены.< br /> -Iruta
Указывает путь к каталогу, в котором находятся файлы, помеченные для включения в исходную программу. Не требует пробела между I и маршрутом, например: -I /usr/include
-L
Указывает путь к каталогу, в котором находятся файлы библиотеки с кодом объекта функций ссылка в исходной программе. Он не занимает пробела между L и маршрутом, например: -L / usr / lib
-Wall
Он показывает все сообщения об ошибках и предупреждениях компилятора, даже некоторые сомнительные, но в конечном счете их легко избежать с помощью тщательно писать код.
-g
он включает в сгенерированный исполняемый файл необходимую информацию, чтобы иметь возможность отслеживать ошибки с помощью отладчика, такого как GDB (GNU Debugger).
-v< br /> Он показывает команды, выполняемые на каждом этапе компиляции, и версию компилятора. Это очень подробный отчет.

Этапы компиляции.
Процесс компиляции состоит из четырех последовательных этапов: предварительная обработка, компиляция, сборка и компоновка. Для перехода от исходной программы, написанной человеком, к исполняемому файлу необходимо последовательно выполнить эти четыре этапа. Команды gcc и g++ способны выполнять весь процесс сразу.
1. Препроцессор.
На этом этапе директивы интерпретируются препроцессору. Среди прочего, переменные, инициализированные с помощью #define, заменяют в коде их значения во всех местах, где встречается их имя.
Мы будем использовать в качестве примера эту простую тестовую программу, circulo.c:
/ * Circle.c: Расчет площади круга.
Пример, показывающий этапы компиляции.
* /
#define PI 3.1416
main ()
{
плавающая область, радио;
радиус = 10;
площадь = PI*(радио*радио);
printf((«Круг.\n»);
printf («%s%f\n\n», «Радиус окружности 10:», area);
}
Предварительную обработку можно запросить любой из следующих команд; cpp конкретно относится к препроцессору.
$ gcc -E circulo.c› circulo.pp
$ cpp circulo.c› circulo.pp
Изучение круга.pp
$ more circulo .pp
видно, что переменная PI была заменена ее значением 3,1416, как оно было установлено в операторе #define.
2. Компиляция.
Компиляция преобразует код C на языке ассемблера процессора нашей машины.
$ gcc -S circle.c
выполните первые два этапа, создав файл circulo.s; изучив его с
$ more circle.s
программу можно увидеть на ассемблере.

3. Ассемблированный.
Сборка преобразует программу, написанную на языке ассемблера, в объектный код, двоичный файл на машинном языке, исполняемый процессором.
Ассемблер вызывается как:
$ as -o Circle.o circle.s
создать файл в объектном коде circle.o из файла Circle.s на языке ассемблера. Не часто приходится выполнять только сборку; Обычным делом является выполнение всех предыдущих шагов до получения объектного кода, подобного этому:
$ gcc -c circle.c
где файл circulo.o создается из circulo.c. Тип файла можно проверить с помощью команды
$ file circle.o
круг: ELF 32-bit LSB relocatable, Intel 80386, версия 1, без разделения
В объемных программах, где много исходников файлы написаны в коде C, очень распространено использование gcc или g++ с опцией -c для компиляции каждого исходного файла отдельно, а затем компоновки всех созданных объектных модулей. Эти операции автоматизированы путем помещения их в файл с именем makefile, интерпретируемый командой make, которая заботится о внесении минимально необходимых обновлений всякий раз, когда какая-либо часть кода изменяется в любом из исходных файлов.
4. Связано< br /> Функции C/C++, включенные в наш код, такие как printf() в примере, уже скомпилированы и собраны в существующих библиотеках в системе. Необходимо каким-то образом включить двоичный код этих функций в наш исполняемый файл. Это этап компоновки, когда один или несколько модулей в объектном коде встречаются с существующим кодом в библиотеках.
Компоновщик называется ld. Команда связать
$ ld -o circle circle.o -lc
ld: предупреждение: не удается найти символ входа _start; по умолчанию 08048184
Дайте эту ошибку из-за отсутствия ссылок. Вам нужно написать что-то вроде
$ ld -o circle /usr/lib/gcc-lib/i386-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o круг /usr/lib/crt1. или /usr/lib/crti.o /usr/lib/gcc-lib/i386-linux/2.95.2/crtbegin.o -L /usr/lib/gcc-lib/i386-linux/2.95.2 circulo.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-linux/2.95.2/crtend.o /usr/lib/crtn.o
для получения исполняемого файла.
Прямое использование линкер ld встречается очень редко. Вместо этого коды объектов gcc обычно предоставляются напрямую:
$ gcc -o circle circle.o
создать исполняемый круг, который вызывается по имени
$ ./circle
Circle.< br /> Область радиокруга 10: 314.160004
Это дает показанный результат.