C/Biblioteki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
przed nazwą makrowartownika używa się _
inny sposób tworzenia biblioteki
Linia 26:
#ifndef _WIKI_H
#define _WIKI_H
#include <stdio.h>
void wiki (void);
void wiki (void) {printf ("pl.Wikibooks\n");}
#endif
</source>
Linia 33 ⟶ 34:
 
Plik nagłówkowy zapisujemy jako "wiki.h".
Teraz napiszmy ciało tej funkcji:
 
<source lang="c">
#include "wiki.h"
#include <stdio.h>
void wiki (void)
{
printf ("pl.Wikibooks\n");
}
</source>
 
Ważne jest dołączenie na początku pliku nagłówkowego. Dlaczego? Plik nagłówkowy zawiera deklaracje naszych funkcji - jeśli popełniliśmy błąd i deklaracja nie zgadza się z definicją, kompilator od razu nas o tym powiadomi. Oprócz tego plik nagłówkowy może zawierać definicje istotnych typów lub makr.
Napiszmy nasz program:
 
Zapiszmy naszą bibliotekę jako plik "wiki.c". Teraz należy ją skompilować. Robi się to trochę inaczej, niż normalny program. Należy po prostu do opcji kompilatora gcc dodać opcję "-c":
 
gcc wiki.c -c -o wiki.o
 
Rozszerzenie ".o" jest domyślnym rozszerzeniem dla bibliotek statycznych (typowych bibliotek łączonych z resztą programu na etapie kompilacji).
Teraz możemy spokojnie skorzystać z naszej nowej biblioteki. Napiszmy nasz program:
 
<source lang="c">
Linia 67 ⟶ 51:
Teraz musimy odpowiednio skompilować nasz program:
 
gcc main.c wiki.o -o main
 
Uruchamiamy nasz program:
Linia 76 ⟶ 60:
Jak widać nasza pierwsza biblioteka działa.
 
Zauważmy, że kompilatorowi podajemy i pliki z kodem źródłowym (main.c) i pliki ze skompilowanymi bibliotekami (wiki.o) by uzyskać plik wykonywalny (main). Jeśli nie podalibyśmy plików z bibliotekami, main.c co prawda skompilowałby się, ale błąd zostałby zgłoszony przez linker - część kompilatora odpowiedzialna za wstawienie w miejsce wywołań funkcji ich adresów (takiego adresu linker nie mógłby znaleźć).
 
=== Zmiana dostępu do funkcji i zmiennych (static i extern) ===