Techniczne

Kompilacja programów w C i C++: jak zamienić kod w program

Kompilator online C++ albo lokalny g++: jak skompilować program w C i C++ i co robią cztery etapy kompilacji, od preprocesora po konsolidator, krok po kroku.

Ilustracja przedstawiająca kod źródłowy zamieniany w program wykonywalny
Obraz wygenerowany przez AI

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 →

EtapOpcja zatrzymaniaWejścieWynik
Preprocesor-Emain.cppmain.ii (kod po rozwinięciu #include i #define)
Kompilacja właściwa-Smain.iimain.s (asembler)
Asemblacja-cmain.smain.o (plik obiektowy)
Konsolidacjabrakmain.oprogram (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 gcc i g++): pokazane wyżej opcje -E, -S, -c, -o pochodzą z jego dokumentacji.
  • Clang (polecenia clang i clang++): 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 zamianie g++ na clang++.
  • 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 poleceniem cl /EHsc main.cpp, a cl.exe tworzy plik .obj i uruchamia konsolidator, który tworzy plik .exe.

Przesuń tabelę, aby zobaczyć wszystkie kolumny →

NarzędziePolecenie dla C++Uwaga
GCCg++ main.cpp -o programopcje -E, -S, -c jak wyżej
Clangclang++ main.cpp -o programzgodny z opcjami GCC
MSVCcl /EHsc main.cppwymaga 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 →

CechaKompilator onlineKompilator lokalny
Instalacjaniepotrzebnatrzeba zainstalować GCC, Clang lub MSVC
Startwklejasz kod i uruchamiaszpiszesz plik, wpisujesz polecenie
Typowe zastosowaniekrótki przykład, sprawdzenie składni, porównanie kompilatorówwłasne projekty, wiele plików, praca bez internetu
Kontrola nad etapamizależy od serwisupełna: -E, -S, -c
Opcje i bibliotekiograniczone do tego, co daje serwisdowolne, 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 directory przy #include.
  • „undefined reference” (etap 4): funkcja zadeklarowana, ale niezdefiniowana albo nie dołączono pliku lub biblioteki.
  • C zamiast C++: kod z std::cout skompilowany jako plik .c nie przejdzie; użyj pliku .cpp i g++.

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.

← Więcej: Techniczne