będą prowadzić do całej masy tajemniczych
komunikatów błędów, a kompilacja zakoń-
czy się niepowodzeniem. Potwierdzi to tyl-
ko nieusprawiedliwioną opinię wielu osób,
że do kompilacji programu w Linuksie nie-
zbędne są umiejętności programistyczne.
Oczywiście nie jest to prawdą. Proces
kompilacji większości aplikacji jest
w znacznej części zautomatyzowany. Czy
chcesz więcej wiedzieć o tym procesie
i o tym, co dokładnie się dzieje
podczas wykonywania kolej-
nych poleceń: configure, make
i make install?
W tym artykule przyjrzymy
się bliżej komunikatom błę-
dów, które można napotkać uruchamiając
skrypt configure. Większość błędów można
łatwo rozwiązać, o ile posiada się odpo-
wiednią wiedzę.
Podstawowe
wyposażenie
Po pobraniu i rozpakowaniu kodu źródło-
wego aplikacji musisz rozejrzeć się w kata-
logu, w którym aplikacja została rozpako-
wana. Zanim zrobisz cokolwiek innego,
przejrzyj najpierw pliki README i IN-
STALL. Dowiesz się z nich, czy przy kom-
pilacji programu wystarczy ograniczyć się
do klasycznych trzech kroków, czy też może
któryś z plików należy najpierw poddać
P
rędzej czy później każdy użytkow-
nik Linuksa doświadczy sytuacji,
gdy nie znajdzie dla swojej dystry-
bucji gotowej biblioteki, potrzebnej do uru-
chomienia jakiegoś nowego, wspaniałego
programu. Dla weterana Linuksa odpo-
wiedź jest oczywista: należy samodzielnie
skompilować kod źródłowy. Niestety, jeśli
kompilator jest dla Ciebie wciąż niezna-
nym terytorium, Twoje wysiłki na pewno
Configure
COVER STORY
26
Lipiec 2004
www.linux-magazine.pl
Od kodu źródłowego do produktu finalnego:
komunikaty błędów skryptu configure
Perfekcyjna
konfiguracja
Nie ma lepszej okazji do oglądania
niezwykłych komunikatów błędów
niż kompilacja programu. Znany
użytkownikom Linuksa skrypt confi-
gure, ma tutaj swój istotny wkład.
Czy można w jakiś sposób uniknąć
problemów związanych z urucha-
mianiem kompilacji?
ANDREA MÜLLER
Rysunek 1: Kategoria „Development” pakietów z narzę-
dzia SuSE YaST zawiera pakiety potrzebne do uruchamia-
nia kompilacji.
[andi@diabolos squaroid-0.60.3]./configure
[...]
checking for GTK – version >= 1.2.0... yes
checking for imlib-config... no
checking for gdk_imlib... not found
configure: error: Cannot find gdk_imlib: I NEED IT!
Listing 1: Komunikaty błędów związane
z brakującymi pakietami programistycznymi
www.PhotoCase.de
Zmienne są w Linuksie wskazywane przez
poprzedzający je znak dolara. Każda dys-
trybucja ma inny zestaw katalogów w ścież-
ce powłoki.
W naszym przykładzie skrypt nie znalazł
kompilatora języka C – aplikacji generują-
cej plik wykonywalny na podstawie progra-
mu napisanego w języku programowania C.
Linux standardowo wykorzystuje kompila-
tor gcc. Niestety, obecnie wiele dystrybucji
nie instaluje domyślnie kompilatora i na-
rzędzi programistycznych.
Tabela 1 pokazuje listę pakietów nie-
zbędnych do przygotowania systemu do sa-
modzielnej kompilacji programów. Obej-
edycji. Wielu programistów wykorzystuje
plik INSTALL do informowania użytkow-
ników np. o dodatkowych wymaganiach
programu.
Pierwsza próba uruchomienia sskkrryyppttuu
ppoow
włłookkii ./configure może od razu zakoń-
czyć się następującym błędem:
checking for gcc... no
checking for cc... no
checking for cc... no
checking for cl... no
configure: error: no acceptable
U
C compiler found in $PATH
Skrypt sprawdza, czy wymagane do kompi-
lacji pliki i programy rzeczywiście istnieją.
Linie zaczynające się od checking pokazu-
ją, co jest sprawdzane. Rezultaty przedsta-
wione są na końcu każdej linii, w tym przy-
padku jest to niepowodzenie (no). Innymi
słowy, skrypt przerywa działanie komuni-
katem błędu, o ile nie uda mu się znaleźć
szukanego programu lub pliku. W naszym
przykładzie w systemie nie ma odpowied-
niego kompilatora dostępnego w ścieżce do-
stępu $PATH.
Polecenie echo $PATH wyświetla listę
katalogów umieszczonych w
ścieżce.
Pakiet
Zawiera
gcc
Kompilator języka C.
gcc-c++
Kompilator języka C++.
libstdc++-devel
Pliki bibliotek niezbędne do kompilacji programów napisanych w C++.
make
Program do automatycznej kompilacji kodu źródłowego w oparciu o reguły zapisane
w plikach Makefile.
binutils
Programy służące do manipulacji plikami binarnymi, m.in. narzędzie ar oraz strip (usuwający
informacje diagnostyczne z programów i bibliotek).
glibc-devel
Pliki bibliotek niezbędne do kompilacji programów napisanych w C.
gettext and gettext-devel
Programy i pliki potrzebne do kompilacji oprogramowania wielojęzycznego. Niektóre dystrybucje
nie zawierają pakietu gettext-devel. Wówczas pakiet gettext zawiera wszystkie wymagane pliki.
XFree86-devel
Pliki niezbędne do kompilacji programów dla X Window
(libxfree86-devel
w niektórych dystrybucjach)
libpng-devel
Pliki nagłówkowe i pliki biblioteki odpowiedzialnej za wyświetlanie obrazów w formacie PNG.
Prawie każda graficzna aplikacja potrzebuje tej biblioteki.
libjpeg-devel
Pakiet niezbędny do kompilacji programów korzystających z biblioteki JPEG.
zlib-devel
Pakiet niezbędny do kompilacji programów korzystających z biblioteki zlib
gtk-devel
Pakiet niezbędny do kompilacji programów korzystających z biblioteki gtk
gtk2-devel
Pakiet niezbędny do kompilacji programów korzystających z biblioteki gtk2. Wymagane
do kompilacji programów takich jak np. GIMP 2.0.
kdelibs-devel
Pakiet niezbędny do kompilacji programów dla KDE.
(kdelibs3-devel dla KDE 3.x)
qt3-devel
Biblioteka programistyczna dla QT. Dostarcza ona elementów GUI dla aplikacji GUI, podobnie
(libqt3-devel w niektórych
jak GTK. Wymagana do kompilacji środowiska i aplikacji KDE.
dystrybucjach)
Niektóre dystrybucje (np. Debian) wykorzystują do identyfikacji pakietów programistycznych przyrostek dev.
muje ona narzędzia, takie jak kompilator
czy program make, oraz pakiety programi-
styczne wymagane do kompilacji aplikacji
działających w trybie graficznym.
Nie daj się zmylić opisom pakietów dla
programistów. Sugerują one, że potrzebu-
jesz ich wyłącznie przy pisaniu swoich wła-
snych programów. To nieprawda – są one
konieczne do kompilowania niektórych pa-
kietów ze źródeł.
Do zainstalowania pakietów programi-
stycznych wykorzystaj menedżer pakietów
Twojej dystrybucji (patrz Rysunek 1). Jeśli
posiadasz SuSE Linux w wersji Personal
Edition, musisz niestety pobrać większość
z nich z serwera FTP SuSE, ponieważ pod-
stawowa wersja SuSE domyślnie nie zawie-
ra wielu pakietów programistycznych.
Opisany powyżej podstawowy zestaw na-
rzędzi usunie przyczynę większości komu-
nikatów błędów. Jednak jeśli komunikaty
błędów będą się powtarzać, trzeba zabawić
się w detektywa.
Szukajcie, a znajdziecie
Listing 1 pokazuje najczęściej spotykany
typ błędów pojawiających się przy urucha-
mianiu configure.
W tym przykładzie skrypt konfiguracyj-
ny informuje o braku gdk_imlib. W linii,
w której napisane jest checking for imlib-
-config... no, zawarta jest informacja o tym,
czego szuka configure – w tym przypadku
jest to skrypt imlib-config. Musimy naj-
pierw sprawdzić, czy programu tego rzeczy-
wiście nie ma w systemie.
Możesz w tym celu wpisać polecenie lloo--
ccaattee imlib-config, by sprawdzić, czy fak-
tycznie brakuje imlib-config. Mogło się tak
zdarzyć, że skrypt configure sprawdzał
w złych miejscach. Alternatywnie użyj find.
Działa ono dużo dłużej, gdyż nie przeszu-
kuje bazy danych.
Jeśli poszukiwanie zakończy się niepo-
COVER STORY
Configure
27
www.linux-magazine.pl
Lipiec 2004
Tabela 1: Podstawowe pakiety i programy
niezbędne do kompilacji programów
Rysunek 2: Narzędzie urpmf w dystrybucji Mandrake przeszukuje bazę danych zawierającą listę
pakietów należących do dystrybucji.
pakietu o nazwie imlib-devel i że dla wyko-
nania poprawnej kompilacji należy go zain-
stalować w systemie.
Wykonanie tego jest trudniejsze w SuSE
Personal lub Red Hat Linux. Red Hat nie
zawiera narzędzia służącego do przeszuki-
wania listy dostępnych, ale nie zainstalowa-
nych pakietów. Poszukiwanie pakietów dla
programistów w SuSE Personal może nie
przynieść efektu, ponieważ nie znajdują się
one normalnie na płytach CD.
W obu przypadkach najlepiej jest wtedy
użyć wyszukiwarek pakietów RPM i DEB
pod adresem [1]. Formularze na stronach
WWW pomagają w przeszukiwaniu pakie-
tów także pod kątem zawartości indywidu-
alnych plików (patrz Rysunek 3). Użytkow-
nicy Debiana mogą też korzystać z wyszu-
kiwarki pod adresem http://packages.de-
bian.org/.
Dobrze ukryte
Sprawa komplikuje się nieco, jeśli configure
nie znajdzie pliku, będącego faktycznie
w systemie. Może być to spowodowane tym,
że sam skompilowałeś wymaganą bibliotekę
lub wykorzystujesz dystrybucję przechowu-
jącą pliki w nietypowym katalogu, do które-
go configure nie zagląda – Listing 2 pokazu-
je taki przypadek.
W tym przykładzie configure nie może
odnaleźć biblioteki ldvdread. Ale nie jest to
nazwa brakującego pliku – litera l na po-
czątku nazwy oznacza lib (biblioteka) i do-
piero po dodaniu na końcu do nazwy .so
otrzymujemy nazwę pliku brakującej bi-
blioteki: libdvdread.so.
Przykładowa biblioteka ldvdread jest
częścią pakietu libdvdread. Jeśli skompilo-
waliśmy ten pakiet samodzielnie i zainsta-
lowaliśmy w katalogu /usr/local/multime-
dia, to polecenie locate libdvdread.so wy-
świetli informację, że biblioteka libdvdre-
ad.so, obecnie poszukiwana przez configu-
re, rzeczywiście znajduje się w katalogu
/usr/local/multimedia/lib.
Jednak configure nie znajdzie pliku, po-
nieważ katalog /usr/local/multimedia nie
jest standardowym katalogiem przeznaczo-
wodzeniem, być może plik naprawdę nie
istnieje. W tym przypadku musisz go zain-
stalować. Ale jak znaleźć jeden plik pośród
tysięcy pakietów, z których składa się dys-
trybucja? Narzędzia dostarczane przez dys-
trybucje Mandrake i SuSE ułatwiają to za-
danie. Jeśli posiadasz Mandrake, wpisz
urpmf imlib-config. To nakaże menadżero-
wi pakietów sprawdzić bazę danych i wy-
świetlić listę pakietów zawierających imlib-
-config (Rysunek 2). Polecenie urpmf
gdk_imlib podpowie nam, że poszukiwane
przez nas pliki znajdują się w pakiecie li-
bimlib1-devel.
Użytkownicy SuSE mogą natomiast uru-
chomić program pin. Gdy po raz pierwszy
uruchamiasz to narzędzie, poprosi ono
o włożenie instalacyjnego medium, z które-
go skopiuje na Twój dysk opisy pakietów
(potrzebne są do tego uprawnienia admini-
stratora). Po zakończeniu tego kroku mo-
żesz uruchomić polecenie pin imlib-config.
Dzięki temu dowiesz się, że plik należy do
Configure
COVER STORY
28
Lipiec 2004
www.linux-magazine.pl
[andi@diabolos ogle-0.9.1]$./configure
[...]
checking for madvise... yes
checking for DVDDiscID in -ldvdread... no
checking for DVDOpen in -ldvdread... no
configure: error: Need libdvdread, install it or specify it's location
Listing 2: Program configure
nie może znaleźć biblioteki
Rysunek 3: Serwis rpmseek.com nie tylko wyszukuje pakiety, ale także przyjmuje nazwy plików jako
wzorzec wyszukiwania.
Rysunek 4: Polecenie ./configure --help wyświetla listę parametrów skryptu konfiguracyjnego.
nym do instalacji oprogramowania. Wyko-
rzystanie tego typu katalogów ma sens, o ile
chcesz przetestować aplikację tylko po to,
by ją za chwilę usunąć lub w przypadku,
gdy nie masz uprawnień do zapisu w całym
systemie plików.
Przedstawiony na Listingu 2 wynik pra-
cy configure wskazuje rozwiązanie: confi-
gure: error: Need libdvdread, install it or
specify it's location. Brakująca biblioteka
jest już zainstalowana. Pozostaje tylko
wskazać configure, gdzie ma dodatkowo szu-
kać tej biblioteki.
Wywołanie configure z flagą --help wy-
świetli listę obsługiwanych parametrów
wraz z krótkim objaśnieniem. Do wskazy-
wania określonej lokalizacji wykorzystuje-
my parametr --prefix. Program configure
domyślnie wykorzystuje katalog /usr/local
(Rysunek 4). Zatem rozwiązaniem naszego
problemu byłoby wywołanie configure
w następujący sposób:
./configure -with-dvdread=/usr
U
/local/multimedia
Mnóstwo opcji
Niektóre skrypty configure dostar-
czają użytkownikom bardziej pre-
cyzyjnych wskazówek odnośnie ob-
sługi komunikatów błędów, np.
configure na Listingu 3 szczegóło-
wo informuje, że nie może znaleźć
programu sdl-config.
W takim wypadku najpierw
sprawdź, czy aplikacja jest zainsta-
lowana w systemie, np. w Mandra-
ke aplikacja jest częścią pakietu
libSDL1.2-devel.
Jeżeli w systemie masz jednak
skompilowaną przez siebie wersję
sdl-config, configure dostarcza kil-
ku podpowiedzi w liniach zaczyna-
jących się od gwiazdek. Tak na-
prawdę sdl-config jest skryptem
informującym configure o tym,
gdzie znajdują się biblioteki SSD
DL
L
oraz wskazującym, jakie ffllaaggii kkoom
mppiillaattoorraa
należy przekazać do Makefile. Oczywiście,
żeby configure mógł znaleźć ten skrypt,
musi on zostać umieszczony w ścieżce do-
stępu PATH. W przypadku, gdy sdl-config
znajduje się w /usr/local/games/bin, wpro-
wadź następującą komendę:
export PATH=$PATH:/usr/
U
local/games/bin
żeby dodać katalog do bieżącej ścieżki po-
włoki. Następujące po znaku „=” wyraże-
nie $PATH pozwala na uniknięcie nadpisa-
nia istniejącej już definicji ścieżki. Nowa
ścieżka powłoki zostanie utworzona przez
złączenie obecnej ścieżki z katalogiem
/usr/local/games/bin. Wprowadź powyższą
komendę do pliku startowego B
Baasshhaa,
.bash_profile znajdującego się w Twoim ka-
talogu domowym /home.
Alternatywnie możesz ustawić zmienną
środowiskową SDL_CONFIG, ponownie
COVER STORY
Configure
29
www.linux-magazine.pl
Lipiec 2004
..//:: Najczęściej katalog, w którym rozpako-
wałeś kod źródłowy, nie należy do ścieżki
wyszukiwania powłoki. Nie możesz zatem
wywołać skryptu configure wpisując tylko
jego nazwę. Do nazwy musisz dodać przed-
rostek./, który wskazuje na katalog bieżący.
llo
occa
attee:: Program ten przeszukuje bazę da-
nych zawierającą lokalizacje plików na dys-
ku. Baza danych jest tworzona poleceniem
updatedb, które w większości dystrybucji
jest uruchamiane automatycznie jako co-
dzienne zadanie programu cron. W SuSE
Linux kombinacja updatedb/locate jest
częścią pakietu findutils-locate. Nie jest on
niestety domyślnie instalowany.
S
SD
DLL:: Simple DirectMedia Layer jest prze-
nośną biblioteką zawierającą funkcje ni-
skopoziomowego dostępu do kart dźwięko-
wych, urządzeń wejścia, joysticka, kart gra-
fiki 3D oraz innych urządzeń.
F
Flla
ag
gii kko
om
mp
piilla
atto
orra
a:: Opcje, które informują
kompilator, gdzie ma szukać bibliotek i pli-
ków nagłówkowych oraz w jaki sposób ma
wykonywać kompilację.
B
Ba
assh
h:: Interpreter poleceń (inaczej powło-
ka), analogiczny do znanego niegdyś
„command.com” z MS-DOS. Dystrybucje
Linuksa wykorzystują Bash jako standardo-
wą powłokę. Istnieją liczne alternatywy Ba-
sha, takie jak tcsh (jego składnia przypomi-
na C) czy zshell.
P
Plliikkii n
na
ag
głłó
ów
wkko
ow
wee:: Pliki (najczęściej z roz-
szerzeniem .h) opisujące interfejsy bibliote-
ki lub aplikacji. Dostarczają szczegółowych
informacji co do sposobu wywoływania
określonych funkcji. Programiści chcący
wykorzystywać te funkcje muszę włączyć
pliki nagłówkowe do kodu źródłowego. Pa-
kiety programistyczne są złożone głównie
z plików nagłówkowych potrzebnych do bu-
dowy aplikacji.
S
Skkrryyp
ptt p
po
ow
włło
okkii:: Plik tekstowy zawierający po-
lecenia sekwencyjnie przetwarzane przez in-
terpreter poleceń (czyli powłokę – w większo-
ści dystrybucji Linuksa jest to Bash).
SŁOWNICZEK
Rysunek 5: Program pkg-config przetwarza plik
gtk+.pc, aby zdobyć wszystkie dane o zainstalowa-
nej wersji biblioteki GTK.
[andi@diabolos lbreakout2-2.5beta-3]$./configure
[...]
checking for main in -lpng... yes
checking for sdl-config... no
checking for SDL – version >= 1.2.0... no
*** The sdl-config script installed by SDL could not be found
*** If SDL was installed in PREFIX, make sure PREFIX/bin is in
*** your path, or set the SDL_CONFIG environment variable to the
*** full path to sdl-config.
configure: error: lib SDL is needed
Listing 3: Komunikat błędu
wraz z zintegrowaną pomocą
W przypadku, gdy samemu skompilowa-
łeś bibliotekę np. libgphoto do obsługi apa-
ratów cyfrowych, pliki zostaną zainstalowa-
ne domyślnie w ścieżce /usr/local. Polece-
nie make install skopiuje libgphoto2.pc do
/usr/local/lib/pkgconfig. Jeżeli spróbujesz
zbudować aplikację korzystającą z tej bi-
blioteki, ./configure wyświetli błąd przed-
stawiony na Listingu 4.
Na właściwej ścieżce
Skrypt configure uważa, że zainstalowana
wersja libgphoto2 jest zbyt stara, ponieważ
wymagania dotyczące obecności biblioteki
libgphoto2 w wersji 2.1.1 lub nowszej nie zo-
stały spełnione. Skrypt nie znalazł libgpho-
to2.pc w ścieżce poszukiwania pkg-config.
Na Listingu 4 configure podpowiada, że
możesz użyć zmiennej środowiskowej
PKG_CONFIG_PATH do poszerzenia
ścieżki wyszukiwania. Sugeruje także, któ-
ry z katalogów powinien zostać dołączony
do ścieżki, tzn. katalog zawierający libg-
photo2.pc.
Tak jak poprzednio wspomniano, ponow-
nie możesz w tym celu użyć polecenia
export do zmodyfikowania ścieżki dostępu:
export PKG_CONFIG_PATH=/usr
U
/local/lib/pkgconfig:/usr
U
/lib/pkgconfig
Powyższe polecenie utworzy ścieżkę wyszu-
kiwania pkg-config, wykorzystując katalog
/usr/local/lib/pkgconfig i ścieżkę domyślną
/usr/lib/pkgconfig. Jest to katalog, w któ-
rym znajduje się libgphoto2.pc. Tak na-
prawdę ta druga ścieżka nie jest konieczna,
ponieważ pkg-config, tak czy inaczej, prze-
szuka swoją ścieżkę domyślną.
Jeśli często kompilujesz programy, warto
dodać definicję PKG_CONFIG_PATH do
Twojego pliku ~/.bash_profile. Wtedy
skrypt configure wywołujący pkg-config nie
powinien mieć kłopotu ze znalezieniem
stosownej wersji libgphoto2 (Rysunek 6).
Więcej pomocy
Przytoczone przykłady nie obejmują
wszystkich błędów configure – szczególnie
takich, gdy skrypt nie stosuje odpowiedniej
opcji albo autor programu popełnił pomył-
kę. Jeśli tego dotyczy Twój problem, to za-
cznij od analizy pliku config.log, który jest
tworzony w katalogu z kodem źródłowym.
To miejsce, gdzie configure rejestruje uru-
chamianie komend i ich rezultaty oraz opi-
sy błędów.
W przypadku gdy, to nie pomoże, możesz
spróbować wprowadzić komunikat błędu do
wyszukiwarki internetowej, takiej jak Go-
ogle. Istnieją także grupy dyskusyjne do-
stępne pod adresem [2], zawierające pomoc-
ne informacje od innych użytkowników.
Możliwe, że ktoś inny miał już podobny pro-
blem i że znaleziono już rozwiązanie. Ostat-
nią deską ratunku jest zwrócenie się do
twórcy programu. Jego adres powinien być
zawarty w pliku AUTHORS. Pliki BUGS
i README często zawierają wymagany
przez autora aplikacji sposób opisu proble-
mu – należy się stosować do zawartych tam
porad, ponieważ zwiększa to szansę na to, że
autor zainteresuje się problemem.
■
wykorzystując komendę export:
export SDL_CONFIG=/usr/local
U
/games/bin/sdl-config
Musisz tutaj również wprowadzić pełną
ścieżkę (na Listingu 3: do pliku sdl-config)
Zmienne
Ostatnio modne jest wykorzystywanie pkg-
-config do wykonywania zadań zwykłe
przypisanych do skryptów konfiguracyj-
nych specyficznych dla danej biblioteki, ta-
kich jak sdl-config. Skrypt pkg-config jest
programistycznym narzędziem służącym
do wykrywania lokalizacji bibliotek i para-
metrów bibliotek wymaganych do popraw-
nej kompilacji programu.
Skrypt pkg-config przetwarza tekstowe
pliki z rozszerzeniem .pc, które zazwyczaj
umieszczone są w katalogu /usr/lib/pkcon-
fig. Dostarczają one informacji, takich jak
wersje zainstalowanych bibliotek, ścieżki
do pplliikkóów
w nnaaggłłóów
wkkoow
wyycchh i bibliotek (patrz
Rysunek 5).
Configure
COVER STORY
30
Lipiec 2004
www.linux-magazine.pl
[1] Wyszukiwarka pakietów RPM i DEB:
http://www.rpmseek.com/
[2] Wyszukiwarka wiadomości w grupach
dyskusyjnych Google:
http://groups.google.com/
INFO
[andi@diabolos gphoto2-2.1.1]$./configure
[...]
checking for libgphoto2 >= 2.1.1... Package libgphoto2 was not
found in the pkg-config search path.
Perhaps you should add the directory containing `libgphoto2.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libgphoto2' found
configure: error: Library requirements (libgphoto2 >= 2.1.1) not
met; consider adjusting the PKG_CONFIG_PATH environment
variable if your libraries are in a nonstandard prefix so
pkg-config can find them.
Listing 4: Komunikat błędu od pkg-config
Rysunek 6: Po poprawnym zdefiniowaniu PKG_CONFIG_PATH „pkg-config” może dostarczyć
prawidłowe informacje skryptowi configure.