Podstawy Informatyki (semestr I)
laboratorium 3
1
Kompilacja i scalanie programów C w linii polece
ń
(LINUX)
Uwaga!
W poni
ż
szym tek
ś
cie ka
ż
de wyra
ż
enie typu <x> oznacza miejsce wstawienia odpowiedniej nazwy
opisywanej przez x. Symbol [x] oznacza wyst
ę
powanie x zero lub jeden raz.
Kompilowanie plików
ź
ródłowych C do postaci plików obiektów wymaga u
ż
ycia opcji „-c”.
gcc -c <nazwa_pliku>.c
W wyniku otrzymuje si
ę
plik obiektu
<nazwa_pliku>.o
Je
ś
li plik nagłówka (.h) nie znajduje si
ę
w bie
żą
cym katalogu ani w
ż
adnym z katalogów zawieraj
ą
cych
nagłówki standardowych bibliotek to przy kompilacji stosowana jest opcja –I <katalog_naglowka> .
(du
ż
e 'i')
gcc –c –I <katalog_naglowka> <nazwa_pliku>.c
Aby wytworzy
ć
kod produkcyjny korzystamy z ustawienia 3 poziomów optymalizacji poprzez opcj
ę
„-
Ox” (x=0,1,2.3). Poziom „-O2” jest odpowiedni dla wi
ę
kszo
ś
ci programów.
Scalanie plików obiektów w program wykonywalny wymaga u
ż
ycia opcji „-o”
gcc –o <nazwa_celu> <nazwa_pliku1>.o <nazwa_pliku2>.o …
<nazwa_celu> oznacza nazw
ę
pliku wykowywalnego, która mo
ż
e, ale nie musi mie
ć
ż
adnego
konkretnego rozszerzenia (takiego jak np. „exe” w systemie Windows).
W wielu systemach uniksowych mo
ż
na poł
ą
czy
ć
kompilacj
ę
i scalanie plików w jednym poleceniu:
gcc –o <nazwa_celu> <nazwa_pliku1>.c <nazwa_pliku2>.c …
Archiwum (bilbioteka statyczna) to zestaw wielu plików obiektów przechowywanych w pojedynczym
pliku o rozszerzeniu „.a”. Tworzy si
ę
je poleceniem „ar” z opcjami „cr”:
ar -crs lib<nazwa_bilbioteki>.a <nazwa_pliku1>.o <nazwa_pliku2>.o …
Archiwum doł
ą
cza si
ę
na etapie scalania plików obiektów w program wykonywalny z wykorzystaniem
opcji „-L” i „-l”. (małe 'el')
„-L<nazwa_katalogu>”: wskazuje poło
ż
enie niestandardowe pliku biblioteki – poza typowo
przeszukiwanymi katalogami „/lib”, „/usr/lib” i katalogami opisanymi w
ś
cie
ż
kach zmiennej
ś
rodowiskowej „LD_LIBRARY_PATH”.
„-l<nazwa_biblioteki>”: opcja scalania wybranej biblioteki z naszym programem wykonywalnym
(celem).
gcc –o <nazwa_celu> <nazwa_pliku1>.c <nazwa_pliku2>.c … -L<nazwa_katalogu_biblioteki>
-l<nazwa_biblioteki>
Podstawy Informatyki (semestr I)
laboratorium 3
2
Kompilacja i scalanie programów C poprzez polecenie „make” (LINUX)
Polecenie „make” szuka w bie
żą
cym katalogu pliku tekstowego o nazwie „makefile” lub „Makefile” w
podanej kolejno
ś
ci. Plik ten zawiera reguły opisuj
ą
ce dla „make” co budowa
ć
(wykonywa
ć
) i w jaki
sposób. Reguły pliku make maj
ą
nast
ę
puj
ą
c
ą
form
ę
ogóln
ą
:
<nazwa_celu>: <zale
ż
no
ść
> [<zale
ż
no
ść
>] […]
<tabulator> <polecenie>
[<tabulator> <polecenie>]
[…]
Cel jest plikiem binarnym(wykonywalnym) lub obiektowym (.o), który chcemy utworzy
ć
.
Polecenia s
ą
krokami takimi jak wywołania kompilatora lub polece
ń
powłoki koniecznymi dla
utworzenia celu.
Je
ś
li cel nie istnieje „make” go buduje zgodnie z poleceniem. W przeciwnym razie porównuje daty
tworzenia celu z datami jego zale
ż
no
ś
ci. Je
ś
li s
ą
one pó
ż
niejsze ni
ż
cel (przynajmniej jedna) cel
podlega przebudowaniu, bo zmienił si
ę
jaki
ś
kod.
Przykład:
prog.e: m1.o m2.o
gcc –o prog.e m1.o m2.o
m1.o: m1.c m1.h
gcc –c m1.c
m2.o: m2.c m1.h
gcc –c m1.c
clean:
rm *.o *.e
Wybrane zmiene automatyczne stosowane w plikach “make”:
$@ -symboliczna nazwa pliku celu w regule
$* -rdze
ń
nazwy pliku (bez rozszerzenia po kropce)
$< -nazwa pliku pierwszej zale
ż
no
ś
ci od reguły
$^ -lista wszystkich zale
ż
no
ś
ci w regule
$? - lista zale
ż
no
ś
ci nowszych ni
ż
cel
Zmienne lokalne w plikach „make” sa przypisywane ró
ż
nym poleceniom na pocz
ą
tku skryptu.
Przypisanie takie (nierekursywne) ma posta
ć
:
<zmienna>:=<polecenie lub warto
ść
>
np. :
CC := gcc
CFLAGS := -g
Odwołanie do takich zmiennych wyst
ę
puje w formie $(<zmienna>)
np. :
$(CC)
$(CFLAGS)
Ogólna reguła kompilacji plików
ź
ródłowych C w poleceniu „make” z u
ż
yciem zmiennych
automatycznych mo
ż
e mie
ć
posta
ć
:
.c.o:
$(CC) $(CFLAGS) –c $*.c
Podstawy Informatyki (semestr I)
laboratorium 3
3
B
ę
dzie ona niejawnie cytowana przy tworzeniu celu:
<plik_wykonywalny>: <plik>.o <plik>.o …
$(CC) $(CFLAGS) $^ -o $@
<plik>.o: <plik>.c <plik>.c …
<plik>.o: <plik>.c <plik>.h …
Przykład prostego pliku ”Makefile” z u
ż
yciem reguł niejawnych, zmiennych lokalnych i zmiennych
automatycznych:
CC := gcc
CFLAGS := -g
.c.o:
$(CC) $(CFLAGS) –c $*.c
prog.e: m1.o m2.o
$(CC) $(CFLAGS) $^ -o $@
m1.o: m1.c m1.h
m2.o: m2.c m2.h
clean:
rm –f *.o *.e
W jednym pliku „Makefile” mo
ż
na definiowa
ć
wiele ró
ż
nych celów – kompilowa
ć
i scala
ć
wiele
programów. Wywołanie „make” odbywa si
ę
z odpowiednim parametrem stanowi
ą
cym nazw
ę
celu i
mo
ż
e zawiera
ć
opcje:
make [-<opcje>] <nazwa_celu lub plik_wykonywalny>
np.:
make prog.e
make clean.
Wybrane opcje polecenia “make”(nie musz
ą
wyst
ę
powa
ć
):
-n : polecenia s
ą
składane i wy
ś
wietlane, ale nie wykonywane (dobre do testów)
-I <katalog> : katalog do poszukiwania plików make poza katalogiem bie
żą
cym (du
ż
e 'i')
-s : (silent) make nie wypisuje polece
ń
na ekranie
-f <plik> : nazwa pliku make inna ni
ż
„makefile” lub „Makefile”
-k : nie przerywa działania je
ś
li nie uda si
ę
zbudowa
ć
jednego z celów
-d : (debug) wy
ś
wietlane s
ą
informacje debugowania
-W<plik> : wykonuje si
ę
tak jakby wymieniony plik był zmodyfikowany (do testowania)
Uwaga!
W systemie UNIX BSD nale
ż
y zastosowa
ć
polecenie gmake (GNU make) aby móc budowa
ć
pliki
„make” w formie charakterystycznej dla Linuxa.
Podstawy Informatyki (semestr I)
laboratorium 3
4
Zadania do wykonania
Celem
ć
wiczenia jest opanowanie umiej
ę
tno
ś
ci kompilacji i uruchamiania programów konsolowych C
w systemie UNIX/Linux.
1. Zalogowa
ć
si
ę
na własne konto na serwerze Katedry Informatyki Stosowanej poprzez
WinSCP i rozpocz
ąć
prac
ę
w konsoli.
2. Utworzy
ć
w podkatalogu „programy” pliki
ź
ródłowe j
ę
zyka C -„main.c”, „modul.c” oraz plik
nagłówkowy „modul.h”. Wpisa
ć
przy pomocy dowolnego edytora tre
ś
ci plików podane
studentom przez prowadz
ą
cego laboratorium. Tre
ś
ci zawieraj
ą
napisy powitalne j
ę
zyka C
wy
ś
wietlane w konsoli.
3. Skompilowa
ć
pliki
ź
ródłowe C przy pomocy polecenia „gcc” z opcj
ą
„-c” w celu uzyskania
plików obiektów (.o). Utworzy
ć
plik programu wykonywalnego „witaj.e” poprzez scalanie
wytworzonych plików obiektów poleceniem „gcc” z opcj
ą
„–o”. Uruchomi
ć
program.
4. Skompilowa
ć
i scali
ć
powy
ż
sze pliki
ź
ródłowe w program wykonywalny jednym poleceniem
„gcc”, bez etapu po
ś
redniego wytwarzania plików obiektów. Uruchomi
ć
program.
5. Przemie
ś
ci
ć
nagłówek „modul.h” do katalogu nadrz
ę
dnego dla katalogu „programy” i
wykorzysta
ć
opcj
ę
„-I” (du
ż
e 'i') polecenia „gcc” do ustalenia jego poło
ż
enia. Sprawdzi
ć
działanie opcji „-O”, „-W”, „-ansi” w procesie kompilacji i scalania.
6. Utworzy
ć
archiwum statyczne „libmodul.a” z pliku „modul.o” przy pomocy polecenia „ar” z
odpowiednimi opcjami. Skompilowa
ć
i scali
ć
„witaj.e” poleceniem „gcc” z opcjami „-L” oraz „-l”
(małe 'el') słu
żą
cymi do podł
ą
czania biblioteki. Uruchomi
ć
program z podł
ą
czon
ą
bibliotek
ą
statyczn
ą
.
7. Utworzy
ć
w katalogu bie
żą
cym plik „makefile” zawieraj
ą
cy dwa cele:
„witaj.e” – kompilacja i scalanie programu wynikowego o nazwie zgodnej z nazw
ą
celu, w
oparciu o
ź
ródła C z punktu 2
„clean” – usuni
ę
cie z bie
żą
cego katalogu wytworzonych plików obiektów (.o) i pliku
wykonywalnego
Opisa
ć
cel:
a) bez
ż
adnych zmiennych automatycznych,
b) z u
ż
yciem wybranych zmiennych („$@, $<,$^,$?”)
Zastosowa
ć
predefiniowan
ą
nazw
ę
kompilatora, zdefiniowa
ć
własne nazwy wewn
ę
trzne opcji i
kompilatora.
8.
Wykona
ć
przygotowane zadania „make” poleceniem:
make <opcje> <nazwa celu> (dla LINUX)
gmake <opcje> <nazwa celu> (dla UNIX BSD)
bez u
ż
ycia
ż
adnych opcji; nast
ę
pnie sprawdzi
ć
działanie opcji „-k”, „ I” (du
ż
e 'i'), „-d”.