
Co to znaczy skompilować program
Komputer nie rozumie kodu źródłowego zapisanego w pliku .c lub .cpp. Potrzebuje kodu maszynowego, a tłumaczy go kompilator. Dokumentacja GCC opisuje to tak: „Compilation can involve up to four stages: preprocessing, compilation proper, assembly and linking, always in that order.”
Wynikiem jest plik wykonywalny, który możesz uruchamiać bez kompilatora. Jeśli zmienisz kod, musisz skompilować go ponownie.
Cztery etapy na jednym krótkim programie
Weź plik main.cpp:
#include <iostream>
#define MNOZNIK 3
int main() {
int x = 4 * MNOZNIK;
std::cout << "Wynik: " << x << '\n';
}
Program wypisuje Wynik: 12. Każdy etap możesz uruchomić osobno kompilatorem g++ (dla C służy gcc i pliki .c).
1. Preprocesor
g++ -E main.cpp -o main.ii
Opcja -E według dokumentacji GCC oznacza: „Stop after the preprocessing stage; do not run the compiler proper.” Preprocesor obsługuje dyrektywy zaczynające się od #: wkleja treść nagłówka <iostream> w miejsce #include i zamienia MNOZNIK na 3. W pliku main.ii będzie dużo wklejonego kodu biblioteki oraz znaczniki linii zaczynające się od #, a na samym końcu funkcja main z linią int x = 4 * 3;, bez dyrektyw #include i #define.
2. Kompilacja właściwa
g++ -S main.ii -o main.s
Opcja -S według dokumentacji: „Stop after the stage of compilation proper; do not assemble.” Kompilator sprawdza składnię i typy, a potem zapisuje program w asemblerze, czyli czytelnej dla człowieka postaci instrukcji procesora. Tu pojawiają się błędy kompilacji, np. brakujący średnik.
3. Asemblacja
g++ -c main.s -o main.o
Opcja -c to według dokumentacji: „Compile or assemble the source files, but do not link.” Powstaje plik obiektowy main.o z kodem maszynowym, ale jeszcze niegotowy do uruchomienia: nie ma w nim połączonej biblioteki standardowej.
4. Konsolidacja
g++ main.o -o program
Konsolidator (linker) łączy pliki obiektowe i biblioteki w jeden program. Dokumentacja GCC mówi, że przy konsolidacji programu C++ g++ „normally automatically links against libstdc++”. Dlatego do konsolidacji kodu C++ używa się g++, a nie gcc. Teraz uruchamiasz ./program (w Windows program.exe). Błędy typu „undefined reference” pochodzą z tego etapu: kompilator widział deklarację funkcji, ale konsolidator nie znalazł jej definicji.
Na co dzień wszystkie cztery etapy robi jedno polecenie:
g++ main.cpp -o program
Podsumowanie etapów
Przesuń tabelę, aby zobaczyć wszystkie kolumny →
| Etap | Opcja zatrzymania | Wejście | Wynik |
|---|---|---|---|
| Preprocesor | -E | main.cpp | main.ii (kod po rozwinięciu #include i #define) |
| Kompilacja właściwa | -S | main.ii | main.s (asembler) |
| Asemblacja | -c | main.s | main.o (plik obiektowy) |
| Konsolidacja | brak | main.o | program (plik wykonywalny) |
Kompilator lokalny: GCC, Clang, MSVC
Wszystkie trzy opisane niżej narzędzia przyjmują kod C i C++, ale różnią się poleceniem i systemem, na którym je zainstalujesz.
- GCC (polecenia
gccig++): pokazane wyżej opcje-E,-S,-c,-opochodzą z jego dokumentacji. - Clang (polecenia
clangiclang++): dokumentacja Clang podaje, że jego sterownik i możliwości języka są „intentionally designed to be as compatible with the GNU GCC compiler as reasonably possible”, więc te same opcje zwykle działają po zamianieg++naclang++. - MSVC (polecenie
cl): kompilator z pakietu Visual Studio. Według dokumentacji Microsoftu nie uruchomisz go w zwykłym oknie wiersza poleceń; potrzebujesz skrótu „Developer Command Prompt”. Program z przykładu kompilujesz poleceniemcl /EHsc main.cpp, acl.exetworzy plik.obji uruchamia konsolidator, który tworzy plik.exe.
Przesuń tabelę, aby zobaczyć wszystkie kolumny →
| Narzędzie | Polecenie dla C++ | Uwaga |
|---|---|---|
| GCC | g++ main.cpp -o program | opcje -E, -S, -c jak wyżej |
| Clang | clang++ main.cpp -o program | zgodny z opcjami GCC |
| MSVC | cl /EHsc main.cpp | wymaga wiersza poleceń programisty |
Wybór standardu języka robisz opcją -std=, np. -std=c++17 albo -std=c++20. Dokumentacja GCC opisuje te wartości jako „The 2017 ISO C++ standard plus amendments.” i „The 2020 ISO C++ standard plus amendments.”
Kompilator online i lokalny obok siebie
Kompilator online działa w przeglądarce: wklejasz kod, wybierasz język i wersję kompilatora, a wynik widzisz na stronie. Przykładem jest Compiler Explorer, opisany przez autorów jako „an interactive compiler exploration website”, który pozwala „Run compilers interactively from your web browser and interact with the assembly”. Pokazuje on m.in. asembler, czyli wynik etapu drugiego z tego artykułu.
Przesuń tabelę, aby zobaczyć wszystkie kolumny →
| Cecha | Kompilator online | Kompilator lokalny |
|---|---|---|
| Instalacja | niepotrzebna | trzeba zainstalować GCC, Clang lub MSVC |
| Start | wklejasz kod i uruchamiasz | piszesz plik, wpisujesz polecenie |
| Typowe zastosowanie | krótki przykład, sprawdzenie składni, porównanie kompilatorów | własne projekty, wiele plików, praca bez internetu |
| Kontrola nad etapami | zależy od serwisu | pełna: -E, -S, -c |
| Opcje i biblioteki | ograniczone do tego, co daje serwis | dowolne, jakie zainstalujesz |
Zasada praktyczna: do nauki pojedynczych instrukcji wystarczy kompilator online, a gdy program ma kilka plików, czyta dane z plików albo chcesz zobaczyć każdy etap, zainstaluj kompilator lokalnie.
Najczęstsze błędy przy kompilacji
- Błąd składni (etap 2): brakujący średnik, nawias lub nieznana nazwa. Kompilator podaje plik i numer linii.
- Brak nagłówka (etap 1): komunikat
No such file or directoryprzy#include. - „undefined reference” (etap 4): funkcja zadeklarowana, ale niezdefiniowana albo nie dołączono pliku lub biblioteki.
- C zamiast C++: kod z
std::coutskompilowany jako plik.cnie przejdzie; użyj pliku.cppig++.
Zobacz też: Pierwszy program w C++, Pętla for, Jak uczyć się programowania.
Najczęstsze pytania (FAQ)
Jaki kompilator online C++ wybrać?
Wybierz taki, który pozwala ustawić wersję kompilatora i standard (np. -std=c++17) oraz pokazuje komunikaty błędów w całości. Do nauki wystarczy dowolny z takimi opcjami; serwis online nie zastąpi lokalnego środowiska przy większych programach.
Jak skompilować program w C?
Zapisz kod w pliku .c i uruchom gcc main.c -o program (albo clang main.c -o program). Etapy są te same co w C++.
Czy muszę rozbijać kompilację na cztery polecenia?
Nie. Jedno polecenie g++ main.cpp -o program wykonuje wszystkie etapy. Osobne polecenia z -E, -S i -c służą do nauki i diagnozowania błędów.
Czym różni się kompilacja od konsolidacji?
Kompilacja zamienia pojedynczy plik źródłowy na plik obiektowy. Konsolidacja łączy pliki obiektowe i biblioteki w gotowy program.
Co oznacza opcja -o?
Dokumentacja GCC: „Place the primary output in file file.” Wskazuje nazwę pliku wynikowego, np. program zamiast domyślnego a.out.