Компилятор g++
Компилятор g++ содержит в себе: препроцессор, ассемблер, линковщик (ld).
Этапы компиляции (хороший видеоурок)
- Препроцессинг (-E) - убирает комментарии, вставляет файлы заголовков (#include заменяет на содержимое подключаемых файлов), обрабатывает директивы условной компиляции (#define, #if, #ifdef и #ifndef). Более того файлы заголовков тоже рекурсивно проходят препроцессинг. Препроцессор работает с кодом на С++ как с обычным текстом и ничего не знает о его синтаксисе (язык препроцессора - это специальный яп, встроенный в С++). Результат: file.ii
- Трансляция/Компиляция (-S) в АСМ код. Результат: file.s
- Ассемблирование (-c) в объектный файл. Результат: file.o
- Линковка/Компоновка объектных файлов в исполняемый (он требуется даже если программа состоит из одного файла)
Единица трансляции - подаваемый на вход компилятора .cpp файл со всеми включёнными в него файлами (.hpp).
Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах. С её помощью линковщик строит связи между множеством объектных файлов и создаёт единый исполняемый файл.
Стандарты С++
-std=c++98
-std=c++11
-std=c++14
-std=c++17
-std=c++2a
Ключи
-Wall
- выводит большинство предупреждений (Warning all)-g
- отладочные символы (для GDB)-S
- компилировать в ASM-o
- в какой файл (a.out по умолчанию)-E
- выполнить только препроцессинг-c
- выполнить только компиляцию объектного файла-I<include_path>
- указать каталог для поиска подключаемых заголовков (g++ -o myexe -I/my/path/to/include main.cpp
)-L<library_path>
- указать каталог для поиска библиотек-l<library>
- указать конкретную библиотеку для линковки (-lm
- подключить библиотеку mathematics)