Statisches Linken

Wie besprochen wollen wir den Code aus dem vorherigen Beispiel statisch zu unserem Programm linken. Als Programm können wir folgendes verwenden:

Datei: main.cpp

#include <iostream>
 
#include "point.hpp"
 
int main() {
    Point p1(13.4f, 3.7f, -0.4f);
    std::cout << "X-Koordinate: " << p1.getX() << std::endl;
    p1.setX(p1.getY() * p1.getZ());
    std::cout << "X-Koordinate: " << p1.getX() << std::endl;
}

Es unterscheidet sich von der bisher gewöhnten Vorgehensweise nicht von den bisherigen Programmen.

GCC / MinGW

Hinweise: Das folgende habe ich (neben Linux) auch mit Wine probiert, da ich kein Windows mehr habe. Sollte sich die Vorgehensweise von einem echten Windows unterscheiden, kann ich das folgende gern noch einmal überarbeiten :)

Da die Vorgehensweise für GCC bzw. MinGW nahezu identisch ist, kann man unter Linux und Windows fast identisch vorgehen:

Zunächst müssen wir unsere Point-Implementierung kompilieren. Dies geschieht mittels

g++ -c point.cpp

und liefert eine point.o. Im nächsten Schritt muss diese zur statischen Library geformt werden:

ar rcs libpoint.a point.o

Dabei wird eine libpoint.a erzeugt. Der Name ist prinzipiell frei wählbar. Allerdings sollte der Suffix .a verwendet werden, da statische Bibliotheken (sowohl unter Linux als auch Windows) stets auf .a enden.

Schließlich kompilieren wir unser eigentliches Programm kompilieren:

g++ -c main.cpp

Die erzeugte Objektfile main.o muss nun nurnoch mit der erstellten Library gelinkt werden. Hier taucht der einzige Unterschied auf: Während ausführbare Binärdateien unter Linux keinen Standard-Suffix haben, enden Windows-Programme in der Regel auf .exe. Aus mehr besteht der Unterschied hier nicht:

Linux:

g++ -o main main.o libpoint.a

Windows:

g++ -o main.exe main.o libpoint.a

Anschließend kann das Programm main normal gestartet werden. Dabei muss die libpoint.a nicht mehr vorhanden sein.

Warum statisch linken?

Der Nutzen von statischen Libraries lässt sich einfach infrage stellen: Prinzipiell könnte man das Erstellen der statischen Library auslassen und die Objektdateien einfach so linken:

g++ -o main.o point.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.