Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Michał Kozakiewicz (michal3)
Biblioteki C++

Zależności biblioteki Allegro 5 i ich obsługa za pomocą pkg-config

[lekcja]

Omówienie

W tej publikacji opowiem Ci o strukturze biblioteki Allegro 5. Dowiesz się jakie należy dodawać pliki nagłówkowe biblioteki, odnośnie do tego co chcesz zrobić. Zdobędziesz opisy bibliotek.

W dalszej części postu, widnieje omówienie kompilowania z użyciem biblioteki Allegro 5. Opisałem bardzo dokładnie jak należy postępować z zależnościami.

Biblioteka Allegro 5 została podzielona na część główną, oraz na wiele dodatków. Każdy kod źródłowy który korzysta z tej biblioteki, musi mieć dodany nagłówek części głównej. Zależnie od tego czy będziesz potrzebować użyć funkcjonalności któregoś z dodatków, wtedy dodajesz jeszcze jego nagłówek. Dla części głównej istnieje jeden wyjątek związany z plikami nagłówkowymi, o tym później.

Zależności pomiędzy dodatkami

  • Main addon -> Allegro
  • Image I/O addon -> Allegro
  • Primitives addon -> Allegro
  • Color addon -> Allegro
  • Font addon -> Allegro
  • TTF addon -> Font addon -> Allegro
  • Audio addon -> Allegro
  • Audio codec addon -> Audio addon -> Allegro
  • Memfile addon -> Allegro
  • Physfs addon -> Allegro
  • Native dialog addon -> Allegro
  • Video streaming addon -> Allegro

Jak to czytać? Rozpatrzmy szósty przypadek. Jeżeli chcesz skorzystać z czcionek TTF, musisz dodać nagłówek biblioteki głównej. Następnie nagłówek dodatku Font, na końcu nagłówek dodatku TTF.

Dla części głównej, jak napisałem wyżej, istnieje wyjątek. Wyjątkiem są funkcje specyficzne dla danej platformy, są wydzielone ponieważ nie są kompatybilne z innymi platformami. Aby ich użyć również potrzebujemy dołączyć nagłówek części głównej. Pamiętaj że stosując je, utrudniasz przenośność kodu miedzy platformami.

  • Windows functions -> Allegro
  • X11 (Linux) functions -> Allegro
  • Mac OS X functions -> Allegro
  • iPhone functions -> Allegro
  • Android functions -> Allegro
  • Direct3D -> Allegro
  • OpenGL -> Allegro

Czas na wyjaśnienie za co odpowiadają dodatki, oraz lokalizacje do plików nagłówkowych. Jeśli podążałeś wcześniejszymi publikacjami tego kursu podczas instalacji biblioteki, pliki biblioteczne powinieneś mieć w następujących katalogach:

Dla MSYS2:
msys2\mingw32\include\allegro5

Dla Linux:
/usr/include/allegro5

Dla Linux cross-compiling Windows:
/usr/i686-w64-mingw32/include/allegro5


Część główna - #include <allegro5/allegro.h>
Jest bazą potrzebną do obsługi wielu podstawowych elementów, przykładowo: ekrany, zdarzenia, klawiatura, myszka, plik konfiguracyjny, timery, wątki, shadery, zarządzanie pamięcią oraz wiele innych

Main addon - brak pliku nagłówkowego
Dodatek nie ma publicznego API, stworzony na potrzeby przenoszenia kodu bez zmian koniecznych dla danej platformy. Wykorzystywany między innymi przez Mac OS X.

Image I/O addon - #include <allegro5/allegro_image.h>
Dodatek umożliwia obsługę bitmap, wczytywanie oraz zapisywanie plików graficznych.

Primitives addon - #include <allegro5/allegro_primitives.h>
Dodatek umożliwiający obsługę podstawowych figur geometrycznych, linie, okręgi, elipsy, trójkąty i wiele innych.

Color addon - #include <allegro5/allegro_color.h>
Dodatek umożliwiający konwersje przestrzeni kolorów, RGB, HSV, CMYK i innych.

Font addon - #include <allegro5/allegro_font.h>
Dodatek umożliwiający manipulacje napisami, wyświetlanie na ekran, skalowanie itp. Rozszerzeniem które obsługuje czcionki TTF jest nagłówek #include <allegro5/allegro_ttf.h>

Audio addon - #include <allegro5/allegro_audio.h>
Obsługa oraz zaawansowane manipulacje dźwiękiem. Obsługa plików dźwiękowych, nagrywania itp. Rozszerzeniem tego dodatku jest #include <allegro5/allegro_acodec.h> obsługuje pliki dźwiękowe w różnych formatach.

Memfile addon - #include <allegro5/allegro_memfile.h>
Dodatek memfile pozwala traktować blok ciągłej pamięci jako plik, umożliwia obsługę jego z wykorzystaniem funkcji I/O.

Physfs addon - #include <allegro5/allegro_physfs.h>
Umożliwia obsługę archiwum danych, przykładowo odczyt obrazu z pliku .zip.

Native dialog addon - #include <allegro5/allegro_native_dialog.h>
Umożliwia obsługę menu, okien dialogowych itp. w systemie na który skompilowany jest program.

Video streaming addon - #include <allegro5/allegro_video.h>
Umożliwia obsługę plików wideo, drobne manipulacje do wyświetlenia na ekranie.

Windows functions - #include <allegro5/allegro_windows.h>
Obsługa pewnych funkcji dostępnych tylko na systemie operacyjnym rodziny Windows.

X11 (Linux) functions - #include <allegro5/allegro_x.h>
Obsługa pewnych funkcji dostępnych tylko na systemach rodziny Linux.

Mac OS X functions - #include <allegro5/allegro_osx.h>
Obsługa pewnych funkcji dostępnych tylko na systemie operacyjnym rodziny Macintosh.

iPhone functions - #include <allegro5/allegro_iphone.h>
Obsługa pewnych funkcji dostępnych tylko na systemie operacyjnym telefonów firmy Apple.

Android functions - #include <allegro5/allegro_android.h>
Obsługa pewnych funkcji dostępnych tylko na systemie operacyjnym Android.


Link do dokumentacji: Allegro 5 reference manual
Korzystaj z tych informacji jak z referencji, po pewnym czasie sam zapamiętasz co gdzie jest.

Dołączanie zależności biblioteki Allegro 5

Skoro masz już świadomość jak radzić sobie z plikami nagłówkowymi, przyszedł czas aby wspomnieć o dołączaniu informacji do kompilatora języka C/C++, gdzie ma szukać plików nagłówkowych i bibliotek. Ta informacja jest jedną z najważniejszych, bez niej nie uda Ci się skompilować żadnego programu z wykorzystaniem biblioteki Allegro 5.

Do tego celu wykorzystuje się program pkg-config, z jego wykorzystaniem dostajemy gotową informacje co ma dołączyć do kompilatora. Pisząc pliki makefile w poprzednich częściach używałem tego programu właśnie do tego celu.

Jako argumenty dodajemy --cflags --libs, informują one program pkg-config aby dołączył flagi dla kompilatora oraz katalog gdzie ma szukać plików bibliotecznych. Pliki biblioteczne po skompilowaniu do programu dołączamy plikami z rozszerzeniem .dll. Dla Linuxa będą to pliki z rozszerzeniem .so, dla zrozumiałości i ujednoliceniu opisu dalej będę mówić o plikach .dll.

Podana komenda przez mnie poniżej, jest dla standardowej wersji biblioteki Allegro 5, gdzie dla każdego dodatku (addon'u) wyróżniamy inny plik biblioteki .dll. Oczywiście oprócz plików .dll dla dodatków, musi znaleźć się plik .dll dla głównej biblioteki Allegro 5 tzw. core library.

Wspomniałem o standardowej wersji ponieważ istnieje jeszcze wersja Monolith, w której wszystkie pliki biblioteczne .dll są złączone w jeden plik. Allegro 5 w wersji Monolith uzyskuję się poprzez przestawienie pewnych opcji podczas budowania biblioteki.

Wersja Monolith mimo dołączenia biblioteki .dll od Allegro 5, wymaga również dołączenia masy innych bibliotek które są w katalogu gdzie znajduję się kompilator C/C++. W wyniku potrafi dodatkowo dołączyć nawet około 40MB niepotrzebnych bibliotek, mówiąc o Windowsie. Dla Linuxa waga może być całkowicie inna ale dzieje się tak samo.

Problemu da się uniknąć kompilując program z wykorzystaniem bibliotek statycznych które posiadają rozszerzenie .a. Wtedy wszystkie biblioteki dołączane są do pliku wykonywalnego zostają w niego wbudowane. Oprócz bibliotek Allegro 5, musimy dodać masę innych bibliotek. Program skompiluje się prawidłowo, nadmierny rozmiar można zoptymalizować poprzez dodanie flagi optymalizacyjnej dla kompilatora C/C++ przykładowo -O2. Kompilowanie statyczne postaram się omówić w którymś z następnych części kursu.

Komenda jest następująca:


`pkg-config --cflags --libs allegro-5 allegro_ttf-5 allegro_primitives-5 allegro_physfs-5 allegro_memfile-5 allegro_main-5 allegro_image-5 allegro_font-5 allegro_dialog-5 allegro_color-5 allegro_audio-5 allegro_acodec-5`

Powyższa komenda musi być dołączona na końcu wywołania polecenia kompilatora. Wymagane jest to ponieważ przed nią muszą być argumenty użytkownika.

Przykładowe wywołanie dla kompilatora języka C:


gcc [argumenty użytkownika np. -O2 -Wall] [wywołanie pkg-config]

Wspomnę również o pewnej bardzo ważnej rzeczy, program pkg-config domyślnie szuka plików z rozszerzeniem .pc w katalogu lib/pkgconfig. Czasami zdarza się problem, wtedy musimy ręcznie wskazać katalog pkgconfig, dzieje się tak w przypadku cross-compilingu z Linuxa dla Windows'a.

Aby ustawić gdzie program pkg-config ma szukać plików z rozszerzeniem .pc, użyj następującego polecenia. Jako przykład podaje gotową komendę którą wykorzystałem w przypadku cross-compilingu, gdzie wymagane jest użycie innego niż domyślny kompilator języka C/C++.


export PKG_CONFIG_PATH=/usr/i686-w64-mingw32/lib/pkgconfig/

Jeżeli będziesz potrzebować ustawić inny katalog, zmień lokalizacje w powyższym przykładzie.

Jak dołączyć zależności Allegro 5 w IDE, przykładowo Eclipse

Ciężko nam ludziom byłoby pisać większe programy w notatniku czy konsoli. Przechodząc do IDE, często musimy je skonfigurować aby używać niestandardową bibliotekę. Aby rozwiązać ten problem dla siebie, musisz wywołać powyższą komendę pkg-config programem echo. Możesz to wykonać przykładowo przez MSYS2 lub na Linuxie.
Jeżeli będziesz robić to dla cross-compilingu, gdzie biblioteki znajdują się w innym miejscu. Musisz dodatkowo przed tą komendą którą podam poniżej wywołać komendę:


export PKG_CONFIG_PATH=

uwzględniając lokalizacje do katalogu pkgconfig.

Polecenie:


echo `pkg-config --cflags --libs allegro-5 allegro_ttf-5 allegro_primitives-5 allegro_physfs-5 allegro_memfile-5 allegro_main-5 allegro_image-5 allegro_font-5 allegro_dialog-5 allegro_color-5 allegro_audio-5 allegro_acodec-5`

Właśnie te polecenie, zwróci nam lokalizacje do plików nagłówkowych, plików bibliotecznych i flag kompilatora. Musisz odczytać i zrozumieć wynik tego polecenia, następnie wpisać te dane w odpowiednie pola w swoim IDE.
Nie podaję jak to zrobić dla konkretnego IDE, ponieważ często możesz je zmieniać oraz każdy może programować w innym.
Poprzedni dokument Następny dokument
Cross-compiling na Windowsa Podstawy