Norbert Langner

Norbert Langner

My homepage @ PUT

(PSiW) Wstęp

W tym temacie zapoznamy się z podstawami programowania aplikacjiwykorzystując API (ang. Application Programming Interface), w naszym przypadku będzie to API POSIX, wspólne dla systemów Uniksowych. Programy będziemy pisać w języku C++, jednak interfejs POSIX zadziała także w programach napisanych w czystym C.

Zanim zaczniemy pisać programy wykorzystujące bezpośrednie funkcje systemu operacyjnego, przypomnimy sobie podstawy C++ oraz poznamy metodę sprawnego kompilowania naszych projektów.

Kompilacja programów w C++

Wszystkie kody w tym repozytorium zostały sprawdzone na systemie Ubuntu 22.04 oraz kompilatorze gcc 11.4.0 oraz glibc 2.35.0. Kody w C++ są zgodne ze standardem C++20.

Aby skompilować program wystarczy wywołać polecenie:

g++ program.cpp

W ten sposób kompilator g++ skompiluje kod z pliku program.cpp i zapisze plik binarny programu do pliku a.out. Wykorzystana zostanie też starsza wersja standardu C++. Dlatego, lepszą opcją będzie wykorzystanie takiego wywołania:

g++ -std=c++20 -Wall -o program program.cpp

Przełącznik -std=c++20 włącza obsługę standardu C++20, najnowszego stablinego wydania dostępnego w chwili ostatniej edycji tego opisu. Opcja -Wall powoduje, że kompilator będzie ostrzegał o wszystkich wyrażeniach, które mogą potencjalnie powodować problemy, bądź nie są zgodzne z tzw. dobrymi praktykami. -o program spowoduje, że wynik kompilacji zostanie zapisany do pliku program, zamiast domyślnego a.out.

W trakcie tworzenia programu można też rozważyć dodanie opcji -O0 -g, które wyłączają optymalizacje kodu oraz dodają do wynikowego pliku symbole debuggera. Są to informacje, które powodują, że debugger może dokładnie wskazywać nazwy funkcji i zmiennych podczas pracy.

CMake

Proces budowania aplikacji można zautomatyzować korzystając z narzędzi typu make lub CMake. Program make jest klasycznym programem użytkowym systemu Unix, który potrafi automatycznie określac, które kody źródłowe należy przekompilować. Wykorzystuje przy tym definiowalny zestaw reguł oraz opcji, definiowany w plikach Makefile. Dzięki temu, kompilowanie całego projektu możemy skrócić do wywołania jednej komendy make. Tworzenie i zarządzanie plików Makefile jest uzależnione od platformy, na której chcemy kompilować programy, dlatego też powstały aplikacje upraszczające ten proces.

Program CMake służy jako niezależny od platformy generator plików dla programów budujących. Początkowo były to różne dialekty Makefile, ale aktualnie CMake potrafi generować też pliki projektów dla rozbudowanych narzędzi IDE, np. Visual Studio, czy XCode.

Aby program CMake mógł przygotować przygotować proces budowania, trzeba przygotować plik konfiguracyjny CMakeLists.txt. Dla naszych potrzeb wystarczy tylko prosta konfiguracja, podobna do pokazanej poniżej. Możliwości tego programu są zdecydowanie większe i najlepiej w tym miejscu odesłać do dokumentacji CMake.

cmake_minimum_required(VERSION 3.20)
project(psiw_intro)
set(CMAKE_CXX_STANDARD 20)
add_executable(example example.cpp)

Aby skompilować projekt opisany powyższym plikiem konfiguracyjnym, wystarczy wywołać polecenie cmake . i potem make, stworzy to dodatkowe pliki w bieżącym folderze, dlatego lepiej poprosić program o wygenerowanie plików np. do folderu build. W takim przypadku, pierwsze budowanie projektu będzie wyglądało w ten sposób:

cmake -B build/
cd build
make

Późniejsze kompilacje, o ile nie dodamy nowego pliku z kodem źródłowym, wykonujemy komendą make. W omawianym przykładzie, skompilowany program znajdziemy w folderze build.

Zadania

  1. Napisz w C++ prosty program pytający użytkownika o imię i wypisujący je na ekran. (cout, cin, string).
  2. Stwórz plik CMakeLists.txt, który pozwoli na zbudowanie wcześniej napisanego programu do pliku wykonywalnego.

Dodatek C++ dla Visual Studio Code

Visual Studio Code jest zaawansowanym edytorem, który dobrze sprawdzi się w roli IDE (ang. Integrated Development Environment - Zintegrowane Środowisko Programistyczne). Podstawowe funkcje dostępne są zaraz po zainstalowaniu VSCode, ale dla ułatwienia pracy, warto zainstalować sobie pakiet C/C++ Extension Pack. Ta paczka rozszerzeń poprawi autouzupełnianie kodu oraz doda obsługę dla CMake w VSCode. Podpowiedzi zaczną być lepsze praktycznie natychmiast, lecz w przypadku CMake, trzeba dokonać drobnej konfiguracji rozszerzenia.

Obsługa CMake ma aktualnie jedną wadę, nie działa, gdy w otwartej przestrzeni roboczej (folderze) jest więcej niż jeden plik CMakeLists.txt. Za każdym razem trzeba więc otwierać folder zawierający jeden projekt CMake.

W przypadku, gdy posiadamy już projekt CMake, wystarczy otworzyć folder w VSCode, a następnie wykonać wstępną konfigurację. Bardzo prawdopodobne jest, że program sam to zaproponuje, gdyby jednak tak się nie stało, wystarczy wywołać Paletę poleceń skrótem Ctrl+Shift+P, a następnie wpisać polecenie CMake: Configure.

Kompilowanie projektu można uruchomić za pomocą klawisza F5 lub klikając napis Build na pasku statusu. Uruchomienie programu to skrót Shift+F5 (wariant bez debuggera) lub Ctrl+F5 (dodatkowo uruchamia debugger).

Dodatek CMake pozwala też automatyczne generowanie pliku CMakeLists.txt dla nowego projektu. Tworzy on, co prawda, nieco inny szablon, niż używany przez nas, ale warto wiedzieć, że i taka opcja istnieje. Dla nowego projektu wywołujemy Ctrl+Shift+P i wybieramy polecenie CMake: Quick Start. Poźniej musimy zdefiniować nazwę projektu, wybrać język i typ projektu (aplikacja lub biblioteka). Na koniec dostajemy gotowy szablon projektu, gotowy do użycia.

Dodatkowa literatura

Temat programowania w języku C++ jest bardzo obszerny, w trakcie naszych zajęć wykorzystamy tylko ułamek tego, co można osiągnąć pisząc programy. Dla zainteresowanych tematyką C++ mogę polecić następujące pozycje. Książki dostępne są do wypożyczenia w bibliotece PP.

  1. Grębosz Jerzy, Opus Magnum C++11, Wydanie II, 2020
  2. Grębosz Jerzy, Misja w nadprzestrzeń C++14/17, 2020
  3. Farbaniec Dawid, C++20 Laboratorium, 2022