Компилиране от командния ред (gcc и clang)

В този урок ще разберете как да компилирате C++ програми от командния ред в терминала на вашата система. Добре е да имате това умение. Големите IDE – та са сложни и за малки задачи или някакъв бърз тест понякога терминала е по бързото решение.

Макари двата компилатора: clang и gcc да са различни те са максимално съвместими по параметри на извикване. И за това ги разглеждаме заедно.

Нека имаме следния код на C++:

#include <print>

int main() {
    std::print("fast test\n");
}

Това е функционалност въведена в C++ 23. За това ще трябва да извикаме компилатора със следния флаг: -std=c++23

Текстови редактори в терминала

Изборът ни не е голям. Препоръчвам ви вградения редактор във всяка система наречен nano или pico. И двете са синоними. Просто едното е връзка към другото и стартира един редактор. Но той няма оцветяване на кода и не подържа команди с мишката.

Другия редактор ще трябва да си го изтеглите от тук. Или да потърсите подходящ начин за инсталиране на вашата дистрибуция. Той има оцветяване на кода и подържа команди с мишка. Нарича се (познайте 🙂 ) micro.

До колкото знам и двата редактора са налични за macOS и Linux. Но не и за Windows.

  • От nano и pico се излиза с клавирната комбинация Control + X;
  • От micro с Control + Q;

Команди в терминала

Ето първо някои команди, които могат да ви потрябват:

mv main main.out // преименува main в main.out
rm main.out      // изтрива фаил
ls               // показва списък с фаиловете в директорията
ls -l            // дава подробен списък с атрибути на фаиловете и големината им

Понякога се налага да зададете ръчно разрешение за стартиране на изпълним файл.

chmod +x main.out
chmod +x main

След това стартирате файла, за да видите резултата от неговото изпълнение:

./main      // или
./main.out

Компилиране

clang++ main.cpp -o main -std=c++23

Това извиква компилатора clang C++. Той компилира main.cpp в изпълнимия файл main.

-o main 

Това указва името на изходния файл: main

-std=c++23

Това задава C++ стандарта, който използваме при компилацията.

Флагове за грешки

-Wall       // основни предупреждения
-Wextra     // още проверки (много полезни)
-Werror     // всичко съмнително става compile error
-Wpedantic  // спазване на стандарта (C/C++)

Флагове за оптимизация

-O0       // без оптимизация (default за debug)
-O1       // базова оптимизация
-O2       // добра оптимизация (най-често използвана)
-O3       // агресивна оптимизация
-Ofast    // максимална оптимизация, но нарушава стандарта

-Os       // оптимизация за размер
-Oz       // още по-малък бинарен файл (Clang)

Пример:

clang++ main.cpp -O2 -Wall -Wextra -o main