Dynamische Bibliotheken |
Spätestens seit dem Siegeszug der grafischen Oberflächen ist es gar nicht mehr möglich, alle Bibliotheken an jede Applikation zu binden. Ansonsten müsste jede Windows-Applikation eine eigene Windows-Umgebung mit sich herumschleppen. Stattdessen befinden sich im System dynamische Bibliotheken, die vom Betriebssystem verwaltet werden. Unter UNIX nennt man sie >>Dynamic Libraries<<. Unter Windows benennt man sie nach ihrer Endung: DLL steht für >>Dynamic Link Library<<.
__declspec(dllexport) double fkt(double w)
{
...
In Visual C++ von Microsoft sieht eine Funktion für eine DLL so aus: (vgl. Wigard, Susanne: Visual C++ 6. bhv, Kaarst, 1999. S. 557.)
extern "C" __declspec(dllexport) double __stdcall fkt(double w)
{
...
Nach der Generierung des Projekts entsteht eine Datei mit der Namenserweiterung
.DLL, die bei der Ausführung des Programms im Arbeitsverzeichnis oder im
Windows-Verzeichnis liegen muss. Daneben gibt es eine Import-Datei mit der
Erweiterung .LIB, die vom aufrufenden Programm hinzugebunden werden muss,
damit es die richtige DLL anfordert. Das funktioniert durch Eintrag der
Datei in die Projekteinstellungen unter Bibliotheken.
Das aufrufende Programm braucht dann noch den Prototyp, um die Funktion
korrekt aufrufen zu können. Dieser lässt sich leicht aus der Funktion
herleiten. Bei Borland C++ sieht der Prototyp so aus:
__declspec(dllexport) double fkt(double w);
Der eigentliche Aufruf unterscheidet sich nicht durch den Aufruf einer gewöhnlichen lokalen Funktion.
[libhello.cpp]
#include <iostream>
using namespace std;
void print_hello()
{
cout << "Hello" << endl;
}
Der Aufruf erfolgt durch das Programm usehello.cpp. Hier wurde der Prototyp der Funktion print_hello() direkt angegeben, der in größeren Programmen natürlich in einer Header-Datei abgelegt würde.
void print_hello();
int main()
{
print_hello();
}
Das Geheimnis besteht hier also ausschließlich darin, wie die beiden Module übersetzt werden. Die Datei libhello.cpp wird zunächst in eine Objektdatei kompiliert. Dabei sorgt die Option -fPIC dafür, dass positionsunabhängiger Code erzeugt wird. Der zweite Aufruf bewirkt das Binden der Objektdatei als dynamische Bibliothek. Die zentrale Option ist hier -Wl,-soname,libhello.so.0. Sie bewirkt, dass die neue Bibliothek unter dem Namen libhello.so.0 gebunden wird. Dabei wird mit .0 auch gleich die Versionsnummer mit kodiert. Die letzten beiden Befehle bewirken, dass auf die Datei unter mehreren Namen zugegriffen werden kann. So muss nicht immer die Seriennummer angegeben werden.
[Kommandos zur Erzeugung einer dynamischen Bibliothek]
c++ -fPIC -c libhello.cpp c++ -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0\ libhello.o -lc ln -sf libhello.so.0.0 libhello.so.0 ln -sf libhello.so.0 libhello.so
Zu guter Letzt muss noch das Programm usehello.cpp übersetzt werden.
[Übersetzen des Hauptprogramms]
c++ usehello.cpp -L. -lhello
|
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Einstieg in C++ Mit freundlicher Genehmigung und Unterstützung des Verlags galileo computing |
| Informatik-Ecke Einstieg in C++ |
(C) Copyright 2005 Arnold Willemer
|