Wstęp
Witajcie! :)
Ostatnio potrzebowałem zainicjalizować projekt aplikacji w C++ z wykorzystaniem cmake’a, w którym będziemy mieli bibliotekę współdzieloną i testy jednostkowe z wykorzystaniem frameworku Google Test.
Udało mi się to zrobić, więc chciałem się tym z Wami podzielić, a także przy okazji zanotować to sobie na przyszłość ;)
Struktura
Tak się przedstawia struktura plików i katalogów (zrzut ekranu z narzędzia tree):
Główny katalog
Jak widać na screenshot’cie, w folderze projektu znajduje się jeden plik: CMakeLists.txt
oraz trzy katalogi: app
, lib
i test
.
Przyjrzyjmy się zatem ich zawartości.
1 | # CMakeLists.txt |
Wyjaśnijmy sobie zawartość tego pliku - jest go główny plik cmake naszego projektu:
#1
- ustawienie minimalnej wymaganej wersji projektu,#2
- ustawienie nazwy projektu,#3
- dwie flagi ustawiające standardC++20
,#4
- kilka flag kompilatora z dodatkowymi sprawdzeniami i ostrzeżeniami,#5
- ustawienie katalogu, w którym znajdzie się nasz zbudowana binarka,#6
- dodanie podkatalogów,#7
- instalacja Google Test’a (skopiowana z tej instrukcji).
App - aplikacja
Tutaj mamy dwa pliki - CMakeLists.txt
i main.cpp
.
1 | # app/CMakeLists.txt |
Opis:
#1
- ustawienie zmiennychAPP
iLIB
, aby łatwiej się do nich potem odnosić,#2
- instrukcja tworząca plik wykonywalny (w tym przypadku z plikumain.cpp
),#3
- instrukcja linkująca bibliotekęLIB
do naszej aplikacjiAPP
.
1 | // app/main.cpp |
To plik zawierający funkcję main naszej aplikacji. Zbyt wiele tu się nie dzieje - tworzymy tylko obiekt Application
i wywołujemy na nim metodę start.
Lib - biblioteka współdzielona
Główny cmake file:
1 | # lib/CMakeLists.txt |
Tu nie ma nic ciekawego, dodajemy tylko podkatalog.
Poniżej mamy dwa katalogi include
i src
. W pierwszym z nich będą znajdowały się pliki nagłówkowe, a w drugim pliki źródłowe.
Ułatwi nam to dodanie plików nagłówkowych do naszej biblioteki.
W poniższych katalogach mamy tylko po jednym pliku nagłówkowym i źródłowym, ale w rzeczywistym projekcie, będziemy ich mieli duużo więcej :)
include
Plik nagłówkowy:
1 | // lib/include/Application.hpp |
Deklaracja klasy z jedną metodą: bool start()
.
src
Kod źródłowy naszej biblioteki:
1 | // lib/src/Application.cpp |
Definicja naszej metody bool start()
.
1 | # lib/src/CMakeLists.txt |
I kolejny plik cmake, w którym dzieje się magia z utworzeniem naszej biblioteki współdzielonej:
#1
- utworzenie biblioteki współdzielonej (SHARED
-> współdzielona,STATIC
-> statyczna),#2
- dodanie katalogu z nagłówkami do naszej biblioteki,#3
-include
dodajemy jakoPUBLIC
, aby użytkownicy naszej biblioteki mogli z nich korzystać,#4
-src
dodajemy jakoPRIVATE
, ponieważ w tym katalogu mogą się znajdować pliki nagłówkowe, których nie chcemy udostępniać na zewnątrz poza naszą bibliotekę.
test - testy jednostowe
I na sam koniec został nam katalog z testami jednostkowymi.
1 | // test/ApplicationTest.cpp |
To jest prosty test, który sprawdza, czy powiodło się uruchomienie naszej aplikacji.
1 | # test/CMakeLists.txt |
To nasz plik cmake’, w którym dodajemy testy jednostkowe:
#1
- włączenie testów dla bieżącego katalogu,#2
- dodanie pliku wykonywalnego naszego testu,#3
- podlinkowanie naszej biblioteki i Google Test,#4
- umożliwienie Google Test odkrycie testów zawartych w pliku wykonywalnym (dokumentacje Google Test).
Podsumowanie
W tym poście przedstawiłem jak skonfigurować prosty projekt w C++, z biblioteką współdzieloną i testami jednostkowymi przy użyciu cmake’a.
W wyjaśnieniach skupiłem się właśnie na komendach cmake, ponieważ to on jako narzedzoe dp budowania umożliwia nam skonfigurowanie projektu.
I co myślicie o tym wpisie? :)
Dajcie znać w komentarzach.
Pozdrawiam,
Sidewinder22