Omówienie
Dla pełnego zrozumienia co przedstawię poniżej, wyjaśnię pojęcie cross-compilingu.
Cross-Compiling jest to generowanie kodu maszynowego czyli wykonywalnego, dla procesora/platformy innej niż ta na której działa cross-compilator. Upraszczając, jeśli chcesz korzystając z Linux'a, zbudować program dla Windows'a. Musisz użyć cross-compilatora.
Tym właśnie zajmę się teraz i opiszę to dla Ciebie. Będziesz mógł tworzyć program z użyciem biblioteki Allegro 5 z Linuxa, dla Windowsa. Jednak aby wykonać to, musisz przygotować dla siebie konsole MSYS2 z części 2, Allegro 5 - część 2. Następnie z części 3, Allegro 5 - część 3, wykonać wszystko do i z krokiem 4. Ja opisując ten post będę korzystać z maszyny wirtualnej którą przygotowałem w części 3.
Krok 1 - Logowanie jako root
Zaloguj się do systemu jako użytkownik z uprawnieniami
root, w moim przypadku
su hasło.
Krok 2 - Aktualizacja systemu
Zaktualizuj listę pakietów i system wydając polecenia
# apt-get update
# apt-get upgrade
Krok 3 - Instalacja cross-compilatora
Teraz należy zainstalować cross-compilator w wersji takiej jak mamy w konsoli MSYS2 na Windowsie. Jeśli podążałeś moimi wcześniejszymi postami, wydaj polecenie
# apt-get install gcc-mingw-w64-i686.
Krok 4 - Przygotowanie bibliotek cross-compilatora
Po zainstalowaniu cross-compilatora, w katalogu
/usr/i686-w64-mingw32 na Linuxie znajdą się dwa katalogi,
include oraz
lib.
W tych powyższych katalogach znajdują się pliki nagłówkowe oraz biblioteki, z których korzysta cross-compilator. Problem jest następujący, w katalogach powyżej brakuje sporej ilości plików. Pomyśl sobie ile trudu teraz zajęłoby pobieranie bibliotek i ich instalacja, następnie kompilacja biblioteki Allegro 5 z użyciem cross-compilatora i zainstalowanie jej w tych katalogach.
Ten problem da się rozwiązać inaczej, właśnie dlatego prosiłem Cię abyś przed wykonaniem tego, zainstalował konsole MSYS2 jak w części 2. Właśnie z niej skopiujemy gotowe już biblioteki, następnie wgramy je do tego katalogu.
Należy teraz skasować te dwa katalogi na Linuxie, unikniemy tym błędów podczas kompilowania, jeżeli na Linuxie byłaby inna wersja bibliotek niż w MSYS2. Nie martw się, MSYS2 zawsze dostarcza najświeższe wersje bibliotek, takie jakie lądują na Linuxie. W tym celu wydaj polecenia
# rm -rf /usr/i686-w64-mingw32/include
# rm -rf /usr/i686-w64-mingw32/lib
Przechodzimy teraz na Windowsie do katalogu gdzie zainstalowaliśmy MSYS2. W moim przypadku jest to
C:\allegro5, następnie do katalogu
mingw32 ponieważ potrzebna będzie nam wersja 32-bitowa.
W tym katalogu zauważysz katalogi
include oraz
lib, jeśli przejdziesz do kolejnego katalogu o nazwie
i686-w64-mingw32 zauważysz kolejne katalogi
include oraz
lib. Skopiuj z katalogu
mingw32 katalogi
include oraz
lib do wybranego przez siebie miejsca, następnie skopiuj katalogi o tych samych nazwach lecz z katalogu
mingw32\i686-w64-mingw32 i dodaj ich zawartość do katalogów gdzie skopiowałeś wcześniej
include oraz
lib. Ja na tę potrzebę skopiowałem te katalogi do katalogu o nazwie
C:\Users\Michal\Desktop\a. Katalog ten po scaleniu waży
480MB.
To nie wszystko, przejdź teraz tam gdzie skopiowałeś te katalogi do katalogu
lib\pkgconfig. W moim przypadku jest to
C:\Users\Michal\Desktop\a\lib\pkgconfig. W tym katalogu znajdują się pliki z rozszerzeniem
.pc dla programu
pkg-config. Program ten umożliwia łatwe dodawanie bibliotek dla kompilatora języka C/C++. Jest to ważne ponieważ w kolejnych postach z tego będziemy korzystać.
Na czym polega teraz problem? W plikach tych istnieje bardzo dużo odniesień do katalogu
/mingw32.
Program
pkg-config na Windowsie, wie po tym gdzie ma szukać plików nagłówkowych i bibliotek. Jako że my zmienimy lokalizacje tych bibliotek i na Linuxie będą one w katalogu
/usr/i686-w64-mingw32. Musimy zmienić w tych plikach wszystkie wpisy
/mingw32 na
/usr/i686-w64-mingw32.
Problem jest prosty, ale może się wydawać czasochłonny przy tej ilości plików. Na wszystko jest sposób, opiszę ci w jaki sposób poradziłem sobie z nim. Jako że używam programu
Notepad++ na Windowsie, skorzystałem z jego dobrodziejstw. W katalogu
C:\Users\Michal\Desktop\a\lib\pkgconfig zaznaczyłem wszystkie pliki skrótem klawiszowym
CTRL+A następnie kliknąłem prawym przyciskiem myszy i wybrałem opcje
Edit with Notepad++. W programie otworzą się wszystkie pliki, następnie z górnego menu wybrałem opcje
Szukaj -> Zamień.... Skrót klawiszowy do tego polecenia to
CTRL+H.
Otworzy nam się okno, takie jak na obrazku powyżej. Wypełniamy pole
Szukany tekst frazą
/mingw32, następnie pole Zamień na frazą
/usr/i686-w64-mingw32. Teraz Uwaga, klikamy tylko
RAZ przycisk
Zamień we wszystkich otwartych dokumentach. Na dole pojawi się napis w języku angielskim, informuje nas o przebiegu. Następnie klikamy w górnym menu ikonę dyskietek, aby zapisać zmiany we wszystkich plikach. Zamykamy program.
Krok 5 - Kopiowanie bibliotek pomiędzy systemami
Jeśli mamy przygotowany katalog
include oraz
lib jak w kroku 4, teraz musimy wgrać je do Linuxa do katalogu
/usr/i686-w64-mingw32. Musisz teraz ten krok dostosować do siebie, jako że ja mam Linuxa wgranego w wirtualnej maszynie. Zalogowałem się z Windowsa za pomocą programu
WinSCP do niego po protokole
SSH. Pliki skopiowałem będąc zalogowanym jako użytkownik
root.
Krok 6 - Test kompilacji
Teraz musimy przetestować czy wszystko działa poprawnie. W tym celu musimy mieć przykładowy program i go skompilować. Wszystko bardzo dobrze opisałem w części 3 w kroku 11. Przejdź do tego postu, wykonaj cały krok 11 a następnie wróć tutaj.
Będąc w Linuxie w katalogu
workspace/01_allegro5test który opisałem w kroku 11 części 3. Wydaj polecenie
make windows. Jeżeli proces przebiegnie prawidłowo, w katalogu
workspace/01_allegro5test/bin/windows zobaczysz plik o nazwie
program.exe. Aby uruchomić ten program w Windowsie, musisz dołączyć do niego pliki biblioteczne Allegro 5 oraz parę zależności od kompilatora. Możesz też ustawić zmienną
PATH w Windowsie prowadzącą do tych plików. Trzecią możliwością jest uruchomienie programu za pomogą MSYS2.
Dodatkowe informacje
Sposobów na wykonanie tego co opisałem powyżej jest wiele, opisałem według mnie najprostszy. Nie wysyłam gotowych plików
include oraz
lib, które omawiałem jak należy przerobić na Linuxa. Ponieważ po pewnym czasie powstawałyby błędy, które wynikały by ze zmian wersji bibliotek itp. Kolejnym powodem jest, abyś poznał metodę jak radzić sobie z takim problemem i umiał sam aktualizować biblioteki dla siebie.