Angenommen man will eine statische Library (.a) erstellen, dann muss man
sich bewusst sein, dass das einfach nur ein Archiv von .o dateien ist.
Das Interface zur Library stellen dann die .h dateien der Library dar,
die Implementation die .c Dateien.
Angenommen meine Library stellt die funktion getRandomNumber bereit,
dann könnte diese so aufgebaut werden:
mylibrary/src/header/mylibrary.h
1 | int getRandomNumber(void);
|
mylibrary/src/mylibrary.c
1 | int getRandomNumber(void){
|
2 | return 4; // chosen by fair dice roll.
|
3 | // guaranteed to be random.
|
4 | }
|
Compilieren und library erstellen:
1 | gcc src/mylibrary.c -c -o tmp/mylibrary.o
|
2 | ar cr bin/libmylibrary.a tmp/mylibrary.o
|
Jetzt haben wir eine statische Library mylibrary/bin/libmylibrary.a und
das interface dazu in mylibrary/src/header/mylibrary.h. Nun könnte man
das in einem Projekt wiefolgt verwenden:
myproject/src/main.c:
1 | #include <mylibrary.h>
|
2 |
|
3 | int main(){
|
4 | return getRandomNumber();
|
5 | }
|
Und compilieren:
1 | gcc -L../mylibrary/bin/ -I../mylibrary/include/ -lmylibrary src/main.c -o bin/myproject
|
Das -L ist das Verzeichnis wo die library gesucht werden soll, -l zum
dazulinken der Library, und mit -I wird dem Kompiler mitgeteilt, wo die
Headerfiles der Library zu suchen sind.
Die Commandos fürs Kompilieren kann man dann in ein Makefile packen, man
kann aber auch cmake, automake, etc. verwenden. Danach muss man am
schluss jeweils nurnoch "make" eintippen.
Deine IDE wird vermutlich auch Optionen haben, um anzugeben welche
Dateien zu kompilieren sind, wo die Header liegen, etc. Das ist dann
aber IDE spezifisch und in anderen Umgebungen ohne diese nutzlos. In
IDEs kann man jedoch meistens auch ein Makefile auswählen. Weil
makefiles (ich meine hier auch Dinge wie cmake oder automake) unabhängig
von Entwicklungsplatform und IDE nutzbar sind, findet man bei OpenSource
Projekten, wie man sie auf z.B. GitHub sieht, normalerweise nur die
Makefiles, aber keine Projektdateien irgendwelcher IDEs. Ich empfehle
deshalb sehr, Makefiles zu verwenden.
PS: Der code ist ungetestet und wurde auf einem Ipad 2 um 4 uhr morgens
eingetippt...