Konkord na Windowsie - MinGW, Boost
Człowiek robi męczące rzeczy z dwóch powodów. Pierwszy powód to czysta ciekawość, a drugi powód to konieczność. Otóż mój kolega posiada Windowsa i chce testować mój program do nauki słówek Konkord, też lubi tak jak uczyć się języków obcych. Niestety nigdy nic nie kompilowałem na Windowsie, musiałem opierać się na skromnych informacjach z Internetu, a najlepsze jest to, że nie było nic po polsku.
MinGW kontra Cygwin
Przechodząc do sedna sprawy, na moim Debianie kompiluję swój program gcc, gdy kiedyś na Windowsie pracowałem, programy kompilowałem MinGW dołączonym do środowiska developerskiego DevC++ (lecz wtedy nie wiedziałem, że używam jakiegoś MinGW). Lecz teraz wiedziałem, że chcą budować aplikację linuksową na Windowsa, mam dwie możliwości, albo zainstalować Cygwina - implementację standardu POSIX dla systemów z rodziny Windows, albo użyć kompilatora MinGW - gcc przeportowanego na systemy z rodziny Windows.
Cygwin zapewniał by mi to, że nie musiałbym zmieniać kodu programu, ani przekompilowywać zewnętrznych bibliotek, których w nim używam, lecz zmusiłbym również tym użytkowników do instalacji Cygwina, a oni raczej nie chcieli by instalować takiego kombajna dla jednego kilkudziesięcokilobajtowego (bez wkompilowanych bibliotek) programu.
MinGW tworzy mi program z rozszerzeniem .exe, który będzie działał na każdym Windowsie i będzie samowystarczalny. Jednak w tym wypadku będę musiał przekompilować biblioteki i je dołączyć do program i czasem zmienić kod programu.
Zdecydowałem się na drugie rozwiązanie, dużo czasu poświęciłem na wstępne przygotowywania, czyli na to, żeby zainstalować i skompilować to, co będzie mi potrzebne do skompilowania programu. Nie żebym aż tak długo się zastanawiał, lecz te pakiety trochę ważą.
Instalacja MinGW
- Ściągamy MinGW-5.1.6, uruchamiamy, klikamy dalej i mamy w folderze
C:MinGWzainstalowany kompilator. - Lecz przydałoby się jeszcze, żeby nie trzeba było wpisywać całej ścieżki, aby uruchomić kompilator i w tym celu klikamy prawym na
Mój Komputer -> Właściwości -> Zaawansowane -> Zmienne Środowiskowe. I tam mamy napis Zmienne Systemowe, pod nim mamy zmienną Path, edytujemy jej wartość, dopisując na końcu;C:MinGWbin. - Hmm... ale mamy wersję 3.4.5 kompilatora. Czyż to nie jest zbyt stara wersja? Aby „zainstalować” nowszą wersję ściągamy z tej strony:
- gcc-ada-4.5.0-1-mingw32-bin.tar.lzma
- gcc-c++-4.5.0-1-mingw32-bin.tar.lzma
- gcc-core-4.5.0-1-mingw32-bin.tar.lzma
- gcc-fortran-4.5.0-1-mingw32-bin.tar.lzma
- gcc-objc-4.5.0-1-mingw32-bin.tar.lzma
- libgcc-4.5.0-1-mingw32-dll-1.tar.lzma
- libgfortran-4.5.0-1-mingw32-dll-3.tar.lzma
- libgmp-5.0.1-1-mingw32-dll-10.tar.lzma
- libgnat-4.5.0-1-mingw32-dll-4.5.tar.lzma
- libgomp-4.5.0-1-mingw32-dll-1.tar.lzma
- libmpc-0.8.1-1-mingw32-dll-2.tar.lzma
- libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma
- libobjc-4.5.0-1-mingw32-dll-2.tar.lzma
- libssp-4.5.0-1-mingw32-dll-0.tar.lzma
- libstdc++-4.5.0-1-mingw32-dll-6.tar.lzma
- mingwrt-3.18-mingw32-dll.tar.gz
C:MinGW(za pomocą programu 7zip). Można oczywiście też próbować edytować plik mingw.ini, jeszcze zanim zainstalujemy starego MinGW, ale zastanawiam się jak zapisać wersję libmpc, libmpfr i libgmp, gdyż wersje, które są domyślnie ściągane, są zastare i nie działają z nowszym gcc.
MSYS
No dobra niby wszystko to, co potrzebne jest zainstalowane, ale przecież, aby skompilować większość programów, nie tylko wydajemy polecenie make, ale wcześniej wydajemy polecenie ./configure, czyli bez Basha ani rusz.
Musimy ściągnąć: msysCORE-1.0.14-1-msys-1.0.14-bin.tar.lzma i bash-3.1.17-2-msys-1.0.11-bin.tar.lzma i wypakować to do folderu C:MinGW. Aby zobaczyć naszego dolara w konsoli poleceń wpisujemy: C:MinGWmsys. Możemy oczywiście sobie „doinstalować” (ściągnąć i wypakować do wiadomo jakiego folderu) inne pakiety MSYS.
Boost
Boost jest to użyteczna kolekcja bibliotek, bardzo przydaje się przy programowaniu w C++ i jej właśnie użyłem w moim programie. Kompilacja źródeł tej biblioteki do bibliotek statycznych wygląda następująco:
- Upewniany się, że mamy na jakiejś partycji około 3 GB wolnego miejsca, budowanie boost-a wymaga trochę miejsca
- Ściągamy
boost-jam-3.1.18-1-ntx86.zipz tej strony. - Wypadkowujemy, a plik
bjam.exeprzenosimy do folderuC:MinGWbin. - Ściągamy
boost_1_42_0.tar.bz2z tej strony. - Wypakowujemy
boost_1_42_0.tar.bz2tam, gdzie mamy dużo miejsca - Uruchamiamy
C:MinGWmsys, wchodzimy do folderu, tam gdzie wypakowaliśmy naszego boosta (aby wejść np. na dysk D: wpisujemycd d. - Wpisujemy
bjam --build-dir=boost-build --toolset=gcc --build-type=complete stage release --without-python - Sprzątamy mieszkanie
- Wpisujemy
bjam --build-dir=boost-build --toolset=gcc install --without-python
C:Boost i tam w katalogu lib mamy statyczne biblioteki, a w include nagłówki.
Korzystałem w dużej cześci z http://ascendwiki.cheme.cmu.edu/Binary_installer_for_Boost_on_MinGW.
Konkord
Ze strony http://github.com/godlark/Konkord pobieramy źródła programu. Można oczywiście odrazu wypakować i wpisać mingw32-make, lecz to nic nie da, bo to jest wersja dostosowana do Windowsa. Plik configure do programu stworzę w późniejszym czasie, teraz musimy sami trochę poprzerabiać.
Prawidłowy plik Makefile:
CXX=g++
CXXFLAGS=-Wall
SOURCE=engine.cpp kurs.cpp main.cpp nakladka.cpp RegisterOfErrors.cpp SingleWord.cpp
OBJ=engine.o kurs.o main.o nakladka.o RegisterOfErrors.o SingleWord.o
%.o : %.cpp
$(CXX) -ggdb3 -c $^ -o $@
konkord.e: $(OBJ)
$(CXX) $^ -ggdb3 -Wl,--enable-auto-import libboost_regex-mgw45-mt.lib -o $@
Również w pliku nakladka.cpp funkcję sleep() musimy zamienić na funkcję Sleep() i argument należy pomnożyć przez 1000, bo windowsowska funkcja przyjmuje czas w milisekundach. I jeszcze w pliku nakladka.h musimy dodać linijkę #include . Teraz wystarczy skopiować libboost_regex-mgw45-mt.lib z naszego folderu C:Boostlib… do katalogu programu i w tym katalogu wydać polecenie mingw32-make.
Zakończenie
Narazie nie wiem jak wykombinować polskie znaki w programie. Jeszcze zobaczę, może wystarczy zmiana kodowania. Wracając jednak do MinGW to zamierzam jeszcze o nim napisać, oczywiście jeśli będzie możliwe skompilowanie źródeł gcc przez mingw. I zastanawia mnie jeszcze jedno, jak skonfigurować boosta, żeby dał się skompilować na linuksie, ale pod windowsa. Jeśli ktoś ma jakieś przemyślenia na ten temat, to serdecznie proszę o podzielenie się nimi :)
Już wiem, jak zrobić polskie znaki, wystarczy pliki zapisać w formacie OEM 852 za pomocą jakiegoś sensownego edytora. Lecz to tylko będą znaki dla Europy Środkowej, chyba trzeba specjalnie przerobić kod dla Windowsa, aby był UTF :/Jeśli spodobał ci się wpis, zasubkrybuje kanał RSS
«Książki - marzec i kwiecień
Polowanie na naiwniaków»
Podobne wpisy
- Rodzina języków C
- Użycie wskaźnika na elementy vectora
- Anacron + Tar = automat do robienia kopii zapasowych
- Jak zmusić użytkowników do wylogowania się, w Linuksie?
- Instalacja i konfiguracja Ubuntu
2 komentarzy »
michalp napisał 23 Czerwca 2010 o 17:04
Ja dostałem warna: Info: resolving std::cout by linking to __imp___ZSt4cout (auto-importc:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line. This should work unless it involves constant data structures referencing symbols from auto-imported DLLs. Warning: .drectve `-aligncomm:___CTOR_LIST__,2 ' unrecognized Warning: .drectve `-aligncomm:___DTOR_LIST__,2' unrecognized)
W końcu skorzystałem z nuwen (www.nuwen.net/mingw.html)
godlark napisał 25 Czerwca 2010 o 14:21
Dzięki za komentarz.
Wystarczyło dodać opcję "-W1,--enable-auto-import", ostrzeżenie by zniknęło. Jednak bez tej opcji jak i z tą opcją musiałbyś kopiować dll-ki razem z programem, jeśli zachciałoby ci się na innym komputerze uruchomić. Lepszą opcją jest statyczne łączenie niektórych bibliotek (nie każda koleżanka będzie mieć MinGW :D), można skorzystać ze tego.
Ale już jak już sobie poradziłeś...
Przetestuję również to nuwen, bo ciekawie wygląda, a wakacje czasu nie będzie mi brakowało ;)