Усі наступні дії проведено при ОС Linux Mint 19 Matе з компілятора g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0.
Склад компілятора g++:
Розглянемо покроково компіляцію і запуск на виконання програми demo.cpp:
#include <iostream> using namespace std; int main() { cout <<"Програму С++ запущено з терміналу!"<<endl; return 0; }
з використанням таких вказівок терміналу:
g++ -E demo.cpp -o demo.ii
Опрацьованння препроцесором коду у вихідному файлі demo.ii. Прапорець -E повідомляє компілятору, що компілювати файл не потрібно, а лише провести його препроцесорну підготовку. У породженому файлі можна побачити величезну кількість нових рядків, це різні бібліотеки та заголовок iostream.
g++ -S demo.ii -o demo.s
Перетворення отриманого на попередньому кроці коду без директив в асемблерний код — проміжний крок між високорівневою мовою та машинним (бінарним) кодом. Асемблерний код — це доступне для розуміння людиною поданя машинного коду. Прапорець -S повідомляє компілятору про потребу зупинитися після стадії компіляції й отримати асемблерний код у вихідному файлі dемо.s.
as demo.s -o demo.o
Асемблювання — перетворення асемблерного коду на машинний і збереження його в об'єктному файлі demo.o. Цю частину машинного коду, ще не пов'язану з іншими частинами машинного коду в кінцеву програму, називають об'єктним кодом. Можливе збереження такого об'єктного коду у статичні бібліотеки, щоб не компілювати цей код знову.
g++ demo.o -o demo
Компонування — пов'язування всі об'єктних файлів і статичних бібліотек в єдиний виконуваний файл. При цьому буде створено таблицю символів — структуру даних, яку зберігають в об'єктних файлах і яка містить назви змінних, функцій, класів, об'єктів тощо, де кожному ідентифікатору (символу) співвідноситься його тип і область видимості. Таблиця символів зберігає також адреси посилань на дані та процедури в інших об'єктних файлах. Саме за допомогою таблиці символів і посилань, що зберігаються в них, можливо побудувати зв'язки між даними інших об'єктних файлів і створити єдиний виконуваний файл з них. На цьому етапі можна додати інші об'єктні файли й бібліотеки. У результаті буде отримано виконуваний файл demo.
chmod u+x demo
Надання файлу demo права бути виконаним. Ця вказівка стосується не роботи компілятора, а лише операційної системи.
./demo
Завантаженя програми у пам'ять з можливим підвантаженням бібліотек. У результаті запуску виконуваного файлу demo буде отримано таке повідомлення у консолі:
Програму С++ запущено з терміналу!
g++ -E demo.cpp -o demo.ii g++ -S demo.ii -o demo.s as demo.s -o demo.o g++ demo.o -o demo chmod u+x demo ./demo
Текст упорядкував Олександр Рудик.