001
13.02.2008, 21:01 Uhr
0xdeadbeef
Gott (Operator)
|
Ich verschieb den Thread mal ins richtige Forum.
Also, prinzipiell kommt eine DLL in drei Teilen - erstend die DLL, die den Code enthält, und die nachher zum Starten des Programms notwendig ist, zweitens die Header der Bibliothek, die zum Kompilieren gebraucht werden, und drittens die .lib-Datei, die zum Linken benötigt wird. (Sie enthält Stub-Funktionen, die auf die DLL zugreifen)
Das mit dem Linken von DLLs ist unter Windows etwas haarig, aus historischen Gründen - Je nachdem, woher der Kram geladen wird, sucht der Linker unterschiedliche Symbole; also kommt es ein bisschen auf die DLL an, wie das ganze zu kompilieren ist. (Das Lesen der Dokumentation wäre angebracht) Wie dem auch sei, prinzipiell musst du folgendes tun:
1. Die Header müssen dem Compiler bekannt sein. Typischerweise kommt eine Bibliothek mit einem include-Verzeichnis, dieses musst du Visual C++ als Header-Verzeichnis angeben (Extras -> Optionen -> VC++-Verzeichnisse, wenn ich mich recht entsinne. Jedenfalls etwas in der Art). Wichtig ist, dass der relative Pfad, den du in der #include-Direktive für die Header angibst, von dem Verzeichnis, das du dem Compiler angibst, die Header-Datei bezeichnet. Also wenn du zum Beispiel im Code
C++: |
#include <test/test.h>
|
stehen hast, und test.h in c:\test-bibliothek\include\test\test.h liegt, musst du dem Compiler c:\test-bibliothek\include als Header-Verzeichnis angeben.
2. Die .lib-Datei muss dem Linker bekannt sein. Typischerweise kommt eine Bibliothek mit einem lib-Verzeichnis, in dem die Datei liegt, wichtig ist aber nur, dass der Linker die .lib-Datei finden kann. Wenn also deine Bibliothek in c:\test-bibliothek\lib\test.lib liegt, musst du ihm c:\test-bibliothek\lib als Verzeichnis angeben. Das geschieht an der selben Stelle, an der du auch das Header-Verzeichnis angibst, nur unter "Bibliotheksverzeichnisse."
3. Die .lib-Datei muss im Projekt als Abhängigkeit eingetragen sein. Das geschieht in den Projekteinstellungen im Unterpunkt "Linker." Unter "zusätzliche Abhängigkeiten" trägst du da "test.lib" ein, wenn deine .lib test.lib heißt. Möglicherweise auch nur "test", da bin ich grad nicht hundertprozentig sicher.
4. Die DLL muss zum Starten des Programms in PATH liegen. Typischerweise trägt man das in den Projekteinstellungen unter "Debug-Optionen" ein, beim Ausliefern des Programms reicht es, wenn die DLL im selben Verzeichnis wie die .exe liegt, die sie benutzt. Oder in c:\windows\system32.
5. Und jetzt wird's haarig. Also, sofern die Bibliothek nicht mit einer .def-Datei kompiliert wurde, die dekorative Dateinamen entfernt - und bei einer C++-Bibliothek wird das nicht der Fall sein - müssen in der Header-Datei all jene Symbole, die beim Kompilieren der Bibliothek mit __declspec(dllexport) exportiert wurden, in deinem Projekt, das die DLL benutzt, mit __declspec(dllimport) deklariert sein. Das ist eine Windows-Besonderheit, die, wie gesagt, historisch gewachsen ist. Wie deine Bibliothek das gelöst hat, kann ich dir nicht sagen - eine häufige Methode ist, dass beim Einbinden der DLL ein Präprozessormakro definiert sein muss, das dazu führt, dass an den entsprechenden Stellen __declspec(dllimport) eingefügt wird, allerdings gehen die Methoden da mitunter weit auseinander. Schau in die Dokumentation der Bibliothek, da muss das eigentlich drinstehen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 13.02.2008 um 21:01 Uhr von 0xdeadbeef editiert. |