CoverStory make


Make COVER STORY
Co robić, gdy make odmawia współpracy?
Ręczne sterowanie
Po zakończonym sukcesem
uruchomieniu skryptu configure,
ostatnim etapem do zbudowania
aplikacji jest już tylko pokonanie
trudności związanych z uruchomie-
niem poleceń make i make install.
ANDREA MÜLLER
łędy pojawiające się przy wywoływa- myślnej pracy polecenia make (Listing 1). trudności ze znalezieniem mimepp.h.
niu poleceń make i make install nie W przypadku nieprawidłowości, make W rzadkich przypadkach make może nie
Bpowinny w ogóle występować. Dzia- może zwrócić nawet kilkadziesiąt komuni- znalezć pliku, mimo że znajduje się on
łania, które podejmuje program make pod- katów błędów. Zasada jest taka, że pierwsza w Twoim systemie.
czas kompilacji i instalacji oprogramowania, informacja jest najważniejsza; wszystkie
M
a
k
e
f
i
l
e
opisane są w pliku Makefile, generowanym pozostałe zazwyczaj z niej wynikają. Na Li- Roztargnieni programiści
przez skrypt configure. Jeśli configure wy- stingu 1 make informuje o niepowodzeniu, Jeśli czujesz się na tyle pewnie, by samemu
kryje, że wymagana biblioteka znajduje się ponieważ kompilator nie znalazł pliku na- dodać coś do kodu zródłowego, łatwo wy-
w katalogu /usr/local/multimedia/lib, infor- główkowego mimepp.h. Błąd ten wystąpił eliminujesz błędy, takie jak ten na Listin-
macja ta będzie zapisana w Makefile jako je- podczas kompilacji pliku o nazwie deco- gu 2. Zwyczajnie rozłożysz na czynniki
den z parametrów kompilacji. deRFC2047.cpp w linii nr 21 tego pliku. pierwsze te zagadkowo wyglądające komu-
Gdy komunikat błędu jest oczywisty, tak nikaty. Początek linii wskazuje, że kompi-
Powierzchowne testy jak w przypadku mimelib/mimepp.h: No lator przetwarza legacyimport.cpp. Linia
Plik Makefile powinien być idealnie dopaso- such file or directory, nie jest konieczne 143 odnosi się do KInputDialog, ale kom-
wany do Twojego systemu. Jeśli tak nie jest sprawdzanie kodu zródłowego. Aby znalezć
i polecenie make zwraca błędy, to najczę- potrzebny pakiet, wykorzystaj polecenia wy-
SAOWNICZEK
ściej jest to wina zle napisanego kodu zró- szukujące konkretne pliki w pakietach, np.:
Makefile: Plik zawierający zestaw reguł
M
a
k
e
f
i
l
e
:
dłowego. W najgorszym przypadku będziesz urpmf mimepp.h (Mandrake Linux), pin mi-
i wszystkie szczegóły wymagane do zbudo-
potrzebował pomocy twórcy programu. mepp.h (SuSE Linux) lub internetową wyszu-
wania programu, np. lokalizacje bibliotek
Możliwe jednak, że z niektórymi proble- kiwarkę pakietów http://www.rpmseek.com/.
i plików nagłówkowych, dyrektywy i opcje
mami poradzisz sobie samodzielnie  cho- Mandrake Linux jako rezultat wyszuki-
sterujące dla kompilatora, a także komendy
dzi tu głównie o niechlujnie przygotowane wania zwróci nazwę kdenetwork-devel. Po
potrzebne do zainstalowania gotowej apli-
skrypty configure, które nie zbierają zainstalowaniu pakietu ponownie uruchom
kacji w katalogu docelowym.
wszystkich informacji niezbędnych do po- make. Tym razem gcc nie powinien mieć
www.linux-magazine.pl Lipiec 2004 31
Make
COVER STORY
Listing 1: Typowy przykład braku pliku potrzebnego do kompilacji
[andi@doomtrain kshowmail-3.1.0-pre1]$ make
[...]
decodeRFC2047.cpp:21:28: mimelib/mimepp.h: No such file or directory
decodeRFC2047.cpp: In function `QCString decodeQuotedPrintable(const QCString&)':
decodeRFC2047.cpp:40: error: `DwString' undeclared (first use this function)
[...]
make[2]: *** [decodeRFC2047.o] Error 1
make[2]: Leaving directory `/home/andi/test/kshowmail-3.1.0-pre1/kshowmail'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/andi/test/kshowmail-3.1.0-pre1'
make: *** [all] Error2
[andi@doomtrain]$ make
pilator nie rozumie tej funkcji (undecla- mym katalogu co kompilowany plik. de. W niektórych wypadkach KDE wykorzy-
red (first use this function)). Undeclared Jak widać na Listingu 2, programista za- stuje katalog /opt/kde3/include.
oznacza, że klasa KInputDialog, która jest pomniał włączyć plik nagłówkowy opisują-
używana po raz pierwszy w tym miejscu, cy klasę. Aby rozwiązać ten problem, mu- grep -r KInputDialog U
nie została wcześniej zdefiniowana tak, by sisz samodzielnie znalezć ten plik. /usr/local/include/*
kompilator mógł ją zauważyć. Oznacza to, Polecenie grep jest użyteczne w znajdowa-
że brakuje części kodu wymaganej do zbu- niu łańcuchów w plikach. Zaczynając w kata- Przełącznik -r (rekurencja) zwróci w na-
dowania pakietu. logu z plikami zródłowymi lub w podkatalo- szym przykładzie dwa rezultaty: kinput-
Programiści używają wielokrotnie tych gu src, polecenie grep KInputDialog *.h bę- dialog.h i klineeditdlg.h. Rezultat pasujący
samych klas, by uniknąć pisania za każ- dzie szukało łańcucha znaków KInputDialog do szablonu, w drugim pliku jest tylko ko-
dym razem od nowa kodu potrzebnego do w plikach o rozszerzeniu .h. Nie zadziała to mentarzem, natomiast linie w kinputdia-
stworzenia tak skomplikowanych obiek- w naszym przypadku, ponieważ KInputDia- log.h wyglądają na tyle skomplikowanie,
tów. Jeśli potrzebujesz obiektu należącego log należy do standardowych klas KDE, by być klasą... (Ramka 1: kinputdialog.h)
do danej klasy, wywołaj jej konstruktor. znajdujących się w jednym z systemowych Zauważmy, że nazwa pliku przypomina
Klasy są interfejsem programu, dlatego katalogów z plikami nagłówkowymi. Najczę- nazwę klasy, mimo że jest napisana małymi
programy C/C++ umieszczają je w pli- ściej są to /usr/include oraz /usr/local/inclu- literami. To dobry znak  żeby sprawdzić,
kach nagłówkowych. Pliki te, najczęściej czy zgadłeś poprawnie, możesz dodać lega-
o rozszerzeniu .h, umieszczane są w tzw. cyimport.cpp poniżej innych dyrektyw włą-
pakietach deweloperskich. W celu umoż- czania plików nagłówkowych (Rysunek 1).
liwienia kompilacji, programista dodaje
do zródeł dyrektywy włączające pliki de- #include
klaracji:
Zwróć uwagę, że make nie zgłasza już błędu.
#include U Metoda ta działa tylko w przypadku, gdy
Rysunek 1: Dodawanie dyrektywy dołączania plik nagłówkowy, zawierający wymaganą de-
do legacyimport.cpp. finicjÄ™, znajduje siÄ™ w Twoim systemie.
Spowoduje to, że kompilator wykorzysta kod
zawarty w pliku kmessagebox.h, znajdujÄ…cym Instalacja z przeszkodami
się w specjalnym katalogu z plikami nagłów- Zdarzają się przypadki, gdy końcowe pole-
kowymi. Katalogi te są przekazywane do cenie make install także zwróci błąd.
kompilatora jako opcje zapisane w pliku Ma- Większość z nich występuje, gdy użytkow-
kefile, według reguły -I/tutaj/znajdu- nicy próbują zainstalować program w kata-
ja/sie/pliki/naglowkowe. Zauważmy, że logu innym niż /usr/local. Jeśli chcesz
w poniższej linii: umieścić aplikację w /usr/local/test, może
się to nie udać. Stanie się tak, gdy progra-
#include  myinclude.h mista nie doda do Makefile wpisów tworzą-
cych katalogi docelowe.
brakuje nawiasów trójkątnych. Oznacza to, W przypadku, gdy /usr/local/test/bin
że kompilator oczekuje, iż plik nagłówkowy Rysunek 2: Jeśli zainstalujesz K3b w katalogu nie istnieje, jakakolwiek próba skopiowa-
myinclude.h będzie znajdował się w tym sa-  /usr/local , nie znajdzie on ikon i wtyczek. nia pliku do tego katalogu zakończy się
32 Lipiec 2004 www.linux-magazine.pl
Make COVER STORY
programom KDE innego katalogu. Użyj
Ramka 1: kinputdialog.h
zmiennej środowiskowej KDEDIRS:
/usr/local/include/kinputdialog.h:class KInputDialog : public KDialogBase
export KDEDIRS=/usr/U
/usr/local/include/kinputdialog.h: KInputDialog( const QString
local:/opt/kde3
&caption, const QString &label,
Ustala ona zmienną dla obu katalogów SuSE
Linux, /usr/local dla samodzielnie skompilo-
Listing 2: Brakująca dyrektywa włączająca
wanego oprogramowania oraz /opt/kde3 dla
plik nagłówkowy
komponentów dystrybucyjnych KDE. W przy-
[andi@doomtrain]$ make
padku Red Hat Linux i Mandrake Linux uży-
wamy export KDEDIRS=/usr/local:/usr.
[...]
Po dostrojeniu zmiennej w powyższy
legacyimport.cpp: In member function `void KLegacyImport::finished()':
sposób, aplikacje KDE będą szukały da-
legacyimport.cpp:143: `KInputDialog' undeclared (first use this function)
nych w podkatalogach /usr/local. GdybyÅ›
legacyimport.cpp:143: (Each undeclared identifier is reported only once
chciał ustawić tę zmienną środowiskową na
for each
stałe, dobrym do tego celu miejscem jest
function it appears in.)
.bash_profile w Twoim katalogu /home.
legacyimport.cpp:143: parse error before `::' token
Wszystkie polecenia, jakie dodasz do tego
make: *** [legacyimport.o] Error 1
pliku, zostanÄ… uruchomione przez Bash-a
w momencie logowania do systemu
Użytkownicy SuSE Linux mają nieco
oczywiście fiaskiem. Najłatwiejszym spo- nych początkujący użytkownicy są instru- więcej pracy do wykonania, ponieważ pole-
sobem na pozbycie się tego rodzaju błędu owani, aby rekompilować aplikację i tym ra- cenie
jest użycie mkdir do tworzenia docelowych zem określić docelowy katalog KDE, wywo-
katalogów, których nazwy można wyśledzić łując skrypt ./configure np. ./configure unset KDEDIRS
w komunikatach błędów. --prefix=/opt/kde3.
Jeżeli posłuchasz tej rady, aplikacja mo- wywoływane przez /opt/kde3/bin/startkde,
Kac po instalacji że się uruchomić. Niestety w rzeczywistości jest skryptem powłoki uruchamiającym śro-
Po zbudowaniu nowej aplikacji KDE, mo- może to okazać się niebezpieczne i obrócić dowisko KDE. Program unset usuwa zawar-
żesz się rozczarować próbując ją uruchomić. się przeciwko Tobie. Katalog /opt/kde3 tość zmiennej środowiskowej, nadpisując
Program może nie być w stanie zlokalizować w przypadku SuSE oraz /usr w Red Hat w ten sposób export. Ze względu na to, że
wtyczek, mieć pusty pasek narzędzi, albo i Mandrake Linux są zarezerwowane dla skrypt ~/.bash_profile uruchamia się przed
uruchomić się w nieprawidłowej wersji języ- menadżera pakietów. Zbudowane na wła- KDE, KDE nigdy nie  dowie się, że istnieje
kowej (Rysunek 2). Domyślenie aplikacje sną rękę programy nie powinny instalować jeszcze inny katalog.
KDE przeszukują wyłącznie katalogi położe- się w tych miejscach. Menadżer pakietów Jeżeli chcesz ustawić tę zmienną na SuSE
nia podstawowych aplikacji. W przypadku nie będzie w stanie ich usunąć. Przy na- Linux, upewnij się, że jesteś zalogowany jako
SuSE Linux, katalogiem domowym KDE stępnej aktualizacji dystrybucji lub KDE root. Otwórz plik /opt/kde3/bin/startkde
jest /opt/kde3, podczas gdy Red Hat i Man- pliki te mogą stać się przyczyną niestabil- w edytorze tekstowym i postaw znak komenta-
drake Linux preferują /usr. Gdy budujesz ności. Możesz już nie pamiętać o aplika- rza (#) przed linią unset KDEDIRS, zakazu-
aplikacje KDE, ikony, wtyczki i pliki pomo- cjach zbudowanych przez siebie, a to znacz- jąc powłoce uruchamiania tego polecenie.
cy zostaną umieszczone w /usr/local. nie utrudni znalezienie winnej aplikacji. Gdyby zaszła w przyszłości taka potrzeba, mo-
Często na internetowych listach dyskusyj- Prawidłowym podejściem jest wskazanie żesz łatwo pózniej usunąć znak  # . %


Wyszukiwarka

Podobne podstrony:
6 make a point
How to Make your Own Tracer Ammunition
HOW TO MAKE AN MESSENGE BOX
Make Money With YouTube
make, do, have, get
130611150731?c tews8 don t make me laugh
Britney Spears?n t make you love me
Make Adjectives from these words
inside covers
Garbage?n´t Seem To Make You Mine
how to make a triangle weave circle
How to make your own power Bleeder
Make your own origami crane
2002 04 Gphoto Make the Most of Your Digital Cameras
Heart All I wanna do is make love to you
How to make perfume
How to Make a Hemp Fishbone & Bead Choker Free Jewelrymaking Instructions
10 Grammar Mistakes That Make You look Stupid
CoverStory gconf

więcej podobnych podstron