Eine statische Library ist nichts weiter eine Sammlung von Objectfiles. Als Beispiel werden wir hier folgende folgende beiden Dateien kompilieren und in eine statische Library packen.
Aus folgende beiden Dateien werden wir die statische Library zusammenstellen:
#include "lib.h" int add( int a, int b ) { return a + b; }
#include "lib.h" int sub( int a, int b ) { return a - b; }
Beide Dateien werden mit folgendem Befehl zu sogenannten Objekt-Files kompiliert:
$ g++ -c -o add.o add.cpp $ g++ -c -o sub.o sub.cpp
Das Argument -c
sagt dem Compiler, dass der Linker nicht aufgerufen werden soll, der versuchen würde, daraus ein ausführbares Programm machen würde. Das geht natürlich nicht, weil beide Quelltexte keine main-Funktion beinhalten.
Der folgende Befehl macht aus den beiden Objekt-Files eine statische Library mit dem Namen 'lib.a'.
ar rcs lib.a add.o sub.o
Nachdem wir nun eine statische Library auf der Festplatte haben, können wir sie ohne neukompilieren, wie ein Objektfile verwenden. Als Beispiel benutzen wir ein kleines Programm, dass die beiden Funktionen verwendet, die in der statischen Lib enthalten sind und kompilieren es.
#include "lib.h" #include "stdio.h" int main( void ) { int result; result = add( 4 , 2 ); result = sub( result, 3 ); printf( "Ergebnis: %d\n", result ); return 0; }
Die Datei, die das Programm enthält wird ebenso kompiliert, wie die beiden Dateien zuvor:
$ g++ -c -o main.o main.cpp
Das erzeugte Objektfile kann nun mit der erstellten Library gelinkt werden. Hierfür lässt sich ebenso der Compiler aufrufen, diesmal muss die Option -c
jedoch weggelassen werden.
$ g++ -o main.o lib.a
…lässt sich einfach in Frage stellen, da man sich den Schritt, Objektfiles zu einer statischen Lib zusammenzufügen mit dem GCC auch sparen kann, indem man dem GCC einfach alle Objektfiles nennt und so das gleiche Ergebnis erhält.
$ g++ -o main.o add.o sub.o
Dennoch lohnt es sich auch heute noch gelegentlich, statische Libs zu erzeugen, um größere Projekte in überschaubarere Unterprojekte unterteilen zu können. Die Unterprojekte liefern die statische Lib, die im Hauptprojekt nur noch gelinkt werden muss - ohne dass das Hauptprojekt wissen muss, aus wievielen oder welchen Dateien diese statische Lib entstanden ist.
Das Projekt als Zip-Archiv, inkl. Makefile: Download