Skocz do zawartości


tablety.pl
Zdjęcie

Instalacja i kompilacja programów




  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 szamrok

szamrok

    Expert Rank

  • Użytkownicy +
  • 1965 postów
  • Płeć:Mężczyzna
  • Lokalizacja:Kraków

Napisano 16 07 2005 - 18:02

Jak kompilowac i instalowac programy

W zwiazku z dosyc czesto wystepujacymi problemami z kompilacja programow (a dokladniej z brakiem podstawowej wiedzy na ten temat), postanowilem napisac tego posta z podstawowymi informacjami na temat kompilacji. Mam nadzieje, ze dzieki temu unikniemy ciaglego powtarzania w postach tego samego problemu. Nie bede wnikal w szczegoly kompilacji i dzialania linkerow/kompilatorow/etc opisze w jak najprostrzy sposob jak skompilowac dowolny (no moze prawie dowolny, bo czasem sa programy, ktore nalezy traktowac nieco inaczej) program.

Pierwszym krokiem jest oczywiscie sciagniecie kodu zrodowego programu. Najczesciej bedzie to plik o postaci:
nazwa_programu-wersja_programu.tar.gz
lub
nazwa_programu-wersja_programu.tar.bz2
Nastepnie nalezy rozpakowac archiwum, poprzez wydanie komendy w konsoli:
dla tar.gz
tar -xvzf plik.tar.gz
dla tar.bz2
tar -jxvf plik.tar.bz2
Mozemy rowniez uzyc do rozpakowania menedzera plikow MC. Aby w tym programie rozpakowac plik nalezy zrobic:
Wybrac plik i nacisnac na nim enter, zaznaczyc pliki i/lub katalogi ktore chcemy rozpakowac i wcisnac F5, pliki zostana rozpakowane do lokacji znajdujacej sie w drugim oknie manadzera plikow (Zasada dzialania jak z windowsowego Total Commandera).
Innym sposobem rozpakowania w MC jest wybranie pliku, wcisniecie F2 i wybranie polecenia Extract the contents of a compressed tar file badz wcisnac klawisz x.
Gdy rozpakujemy juz nasze zrodla, nalezy przejsc do katalogu z rozpakowanymi plikami i wydac polecenie:
./configure
badz w MC wcisnac enter na pliku configure.
Plik ten jest skryptem, ktory automagicznie konfiguruje nasze zrodla w zaleznosci od naszego systemu/bibliotek/etc. W czasie dzialania configure, mozemy dowiedziec sie czy jakiejs biblioteki nam nie brakuje, dla przykladu pokaze czesc loga z kompilacji programu Gimp, ktory jest bardzo dobrym programem graficznym.
Sciagamy Gimpa, rozpakowujemy, i odpalamy plik configure, systemu wyrzucam nam pelno linijek tekstu (ktore dla laika moga byc malo interesujace :( ) i nagle dzialanie zatrzymuje sie i widzimy np. taki oto tekst:

checking for GTK+ - version >= 2.2.2... yes (version 2.4.1)
checking if GTK+ is version 2.3.0 or newer... yes
checking for gdk-pixbuf-2.0 >= 2.2.2... yes
checking GDK_PIXBUF_CFLAGS... -I/usr/include/gtk-2.0 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include 
checking GDK_PIXBUF_LIBS... -Wl,--export-dynamic -L/usr/local/lib -lgdk_pixbuf-2.0 -lm -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 
checking for gdk-pixbuf-csource... /usr/bin/gdk-pixbuf-csource
checking for libart-2.0... Failed to open '/usr/local/lib/pkgconfig/libart-2.0.pc': No such file or directory
No package 'libart-2.0' found

configure: error: Library requirements (libart-2.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.

Konfiguracja zrodel programu zatrzymala sie przy sprawdzaniu czy posiadamy biblioteke libart gdy nie zostala ona znaleziona w systemie. W takim wypadku nalezy oczywiscie ja zainstalowac. Instalujemy owa biblioteke i wlaczamy ponownie skrypt configure.
Tym razem konfiguraca przebiega pomyslnie i nie wyrzuca nam zadnego bledu.
Kilka koncowych linii wypisanych przez system wyglada w przypadku Gimpa tak:

config.status: creating config.h
config.status: executing depfiles commands
config.status: executing default-1 commands
config.status: executing default-2 commands
config.status: executing libgimpbase/gimpversion.h commands
config.status: libgimpbase/gimpversion.h is unchanged
config.status: executing chmod-scripts commands
config.status: executing sed-po-makefiles command

Oczywiscie przy innym programie nazwy beda sie roznic, wiec najlatwiej sprawdzic czy konfiguracja przeszla pomyslnie gdy nie zobaczymy napisu configure: error :
Po skonfigurowaniu zrodel nalezy przejsc do wlasciwej kompilacji programu. Wpisujemy komende:
make
rozpocznie sie teraz kompilacja programu, ktora moze potrawac od kilkunastu sekund do kilku godzin :D w zaleznosci od sprzetu jaki posiadamy i od programu jaki kompilujemy.
Na ekranie konsoli bedziemy mogli podziwiac dziesiatki/setki/tysiace szybko przelatujacych linijek z poleceniami przekazywanymi do/z kompilatora, badz samymi wywolaniami kompilatora. Dla przykladu zaprezentuje przykladowe linijki :)

gcc -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include -DPREFIX=\"/usr/local\" -DGIMPDIR=\".gimp-2.0\" -DDATADIR=\"/usr/local/share/gimp/2.0\" -DLOCALEDIR=\"/usr/local//locale\" -DPLUGINDIR=\"/usr/local/lib/gimp/2.0\" -DSYSCONFDIR=\"/usr/local/etc/gimp/2.0\" -DG_LOG_DOMAIN=\"LibGimpBase\" -DGDK_MULTIHEAD_SAFE -DGTK_MULTIHEAD_SAFE -O2 -march=athlon-xp -mcpu=athlon-xp -mfpmath=sse,387 -pipe -ffast-math -s -DNDEBUG -DG_DISABLE_ASSERT -Wall -MT gimpparasiteio.lo -MD -MP -MF .deps/gimpparasiteio.Tpo -c gimpparasite

Tak naprawde to nie wazne co tam miga nam w konsoli, wazne ze sie kompiluje :D
Po skonczeniu kompilacji (nie ma jakiegos komunikatu w stylu "compilation completed" tylko przestaja nam "latac" linijki z tekstem :) ) mozemy zainstalowac program poleceniem:
make install
Tutaj mala uwaga zamiast wpisywac powyzesz polecenie polecam uzyc programu checkinstall, ktory tworzy nam paczke tgz/rpm/deb i instaluje program i zapisuje paczke na dysku. Stworzenie paczki ulatwia pozniej deinstalacje programu oraz ewentulana pozniejsza instalacje programu (paczka zawiera skompilowany program, wiec nie musimy od nowa kompilowac).
Jesli nie uzyjemy programu checkinstall, a chcemy usunac program to w katalogu ze zrodlem programu wpisujemy:
make uninstall
Gdybysmy uzywali checkinstalla to program zainstalowany bylby w postaci paczki, ktora mozna usunac tak jak kazda inna (nie musimy miec na dysku katalogu ze zrodlem programu).

Powyzszy opis odnosil sie do sytuacji gdy mamy prawa root'a, jesli jestesmy zwyklym uzytkownikiem to proces kompilacji bedziemy musieli przeprowadzic odrobine inaczej:
Rozpakowujemy zrodla do katalogu, i nastepnie odpalamy w konsoli:
./configure --prefix=$HOME
dzieki temu program zostanie zainstalowany w naszym katalogu domowym (bo nie mamy dostepu do katalogow /bin /usr, wiec struktura ich zostanie utworzona w naszym katalogu domowym). Reszte kompilacji przeprowadzamy tak samo jak robilby to root.


Rozne bledy przy kompilacji

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for g++... no
checking for c++... no
checking for gpp... no
checking for aCC... no
checking for CC... no
checking for cxx... no
checking for cc++... no
checking for cl... no
checking for FCC... no
checking for KCC... no
checking for RCC... no
checking for xlC_r... no
checking for xlC... no
checking for C++ compiler default output... configure: error: C++ compiler cannot create executables
See `config.log' for more details.
Brak kompilatora, nalezy zainstalowac pakiety
gcc
gcc-g++
gcc-objc

Pakiety te znajdziemy na plytce od naszej dystrybucji, badz sciagniemy z internetu.


Optymalizacja programu
--------------------w trakcie budowy------------------------
Podczas kompilacji programu mozemy ustawic odpowiednie flagi na kompilator (pewnego rodzaju zmienne, ktore kompilator interpretuje i zgodnie z ich ustawieniemi uzywa optymalizacji kody przy kompilacji).
Program skompilowany z odpowiednim zestawem flag moze dzialac szybciej o nawet kilkadziesiat procent, jednak sa to przypadki sporadyczne, srednio przyrost wydajnosci jest rzedu kilku procent, duza czesc uzytkownikow nie zauwaza wogole przyrostu wydajnosci. Dlatego kwestie tego, czy warto kompilowac programy pod swoj procesor, czy uzywac gotowych paczek dostarczanych z dystrybucja pozostawiam do wlasnej oceny.

Do podstawowych flag jakie mozemy uzyc naleza: march oraz mcpu, ktore okreslaja typ i architekture naszego procesora. Przykladowe wartosci tych flag to:
i386, i486, i586, i686, pentium, pentium-mmx, pentiumpro, pentium2, pentium3, pentium4, k6, k6-2, k6-3, athlon, athlon-tbird, athlon-4, athlon-xp, athlon-mp
Wybranie danego procesora w zmiennej mcpu nie oznacza, ze bedzie mogl byc on uruchamiany tylko na takim rodzaju procesora, za przyklad moze posluzyc sposob w jaki kompilowany jest Slackware: -march=i486 -mcpu=i686 czyli odpalimy go na dowolnym procesorze 486 lub lepszym, a na procesorach P3/4 Athlon/Duron system bedzie wykorzystywal specyficzne dla tych procesorow instrukcje (SSE, 3DNOW, itp).
Dla mojego procesora czyli Duron 1000 wykorzystuje flagi:
-mcpu=athlon-xp -march=athlon-xp
Dodatkowo jesli chodzi o flagi zwiazane z rodzajem procesora to wystepuja jeszcze:
mmmx, msse, msse2 oraz m3dnow. W manualu do gcc mozemy przeczytac, ze okreslenie typu procesoraw march i mcpu automatycznie wymusza uzycie danych instrukcji procesora, wiec np: mozna pominac dopisywanie -m3dnow czy -mmmx jesli wybralismy mcpu=athlon-xp.

Kolejna bardzo wazna flaga jest Ox gdzie x to rodzaj optymalizacji. Do podstawowych wartosci x naleza: 0,1,2,3 oraz s. Najbardziej popularne rodzaje optymalizacji to O2 oraz Os gdzie pierwszy rodzaj optymalizuje szybkosc programu kosztem jego objetosci, a Os odwrotnie. Optymalizacja O0 oznacza brak optymalizacji. Wiecej informacji na temat rodzajow optymalizacji tutaj.

Wiele osob bardzo czesto uzywa rowniez flag ffast-math oraz pipe.

Jak ustawic wlasne flagi
Kompilator GCC pobiera ustawienia flag ze zmiennych CFLAGS (dla programow w C) oraz CXXFLAGS (dla programow w C++). W zaleznosci od dystrybucji mozemy wartosci tych zmiennych ustawic na kilka sposobow:
- niektore dystrybucje posiadaja plik /etc/make.conf gdzie mozemy wpisac swoje flagi
- w wiekszosci przypadkow mozemy w pliku /etc/profile wpisac np:
export CFLAGS="nasze flagi"
- zapewne w bashrc rownie mozna to zrobic
- exportowac recznie zmienne za kazdym razem :)

Moje aktualne flagi wygladaja nastepujaco:
export CHOST="i686-pc-linux-gnu"
export CFLAGS="-Os -march=athlon-tbird -mcpu=athlon-tbird -pipe -fomit-frame-pointer -s -DNDEBUG -DG_DISSABLE_ASSERT"
export CXXFLAGS="-Os -march=athlon-tbird -mcpu=athlon-tbird -pipe -s -DNDEBUG -DG_DISSABLE_ASSERT"
export LDFLAGS="-s -z -combreloc"

Ciekawe linki:
Gcc i386 and x86-64 options
Przykladowe flagi
Kompilacja
Dołączona grafika - darmowy program do katalogowania książek




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych