Erstellen und Verwenden einer statischen Library

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.

Erstellen der Library

Die Quelldateien

Aus folgende beiden Dateien werden wir die statische Library zusammenstellen:

File: add.cpp

#include "lib.h"
 
int add( int a, int b )
{
  return a + b;
}

File: sub.cpp:

#include "lib.h"
 
int sub( int a, int b )
{
  return a - b;
}

Kompilieren

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.

Zu einer Library verbinden

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

Verwenden der Library

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.

Die Quelldatei

File: main.cpp

#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;
}

Kompilieren

Die Datei, die das Programm enthält wird ebenso kompiliert, wie die beiden Dateien zuvor:

$ g++ -c -o main.o main.cpp

Mit der Library linken

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

Der Nutzen von statischen Librarys

…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.

Download

Das Projekt als Zip-Archiv, inkl. Makefile: Download