Konkord na Windowsie - MinGW, Boost

Tagi: , , , , , , , , , , , ,
Kategoria:

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:MinGW zainstalowany 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
    i wypakowujemy to do folderu 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.zip z tej strony.
  • Wypadkowujemy, a plik bjam.exe przenosimy do folderu C:MinGWbin.
  • Ściągamy boost_1_42_0.tar.bz2 z tej strony.
  • Wypakowujemy boost_1_42_0.tar.bz2 tam, gdzie mamy dużo miejsca
  • Uruchamiamy C:MinGWmsys, wchodzimy do folderu, tam gdzie wypakowaliśmy naszego boosta (aby wejść np. na dysk D: wpisujemy cd 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
Jeśli wszystko poszło dobrze, to mamy katalog 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



2 komentarzy »

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)

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 ;)

Roznica szesc i siedem
Nick
Email (będzie ukryty)
Webpage