kostenloser Webspace werbefrei: lima-city


Anfängerfrage zu .dll linking

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    makawa

    makawa hat kostenlosen Webspace.

    Hallo alle zusammen.
    Ich bin in Sachen C++ noch nicht wirklich gut, weswegen mein Frage eventuell etwas dämlich klingt.

    Normalerweise benutze ich .dlls nur wenn ich winapi funktionen nutzen will, so wie z.B. winsocket. Dabei linke ich immer eine .a Datei aus dem Installationsverzeichniss meinr IDE (Code::Blocks) und danach stehen mir die entsprechenden includes und damit die Klassen zur verfügung.

    Nun möchte ich mich mit sqlite beschäftigen. Dazu habe ich mir die entsprechenden Dateien heruntergeladen. Es handelt sich um die sqlit3.dll und die sqlite3.def. Nur wie bekomme ich diese Dateien in mein Projekt? Habe ich prinzipiell etwas nicht kapiert?

    Vielen Dank im Vorraus
    makawa
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi makawa,

    zuerst mal eine kleine Korrektur: die .a Dateien, welche du linkst sind Statische Bibliotheken(.a oder .lib), d.h. sie werden nicht dynamisch
    zur Laufzeit geladen, sonden während des Compilierens zu der ausführbaren Datei(exe) hinzugefügt.

    Dynamisch gelinkte Bibliotheken(.so oder .dll) werden bei der Ausfürung des Programmes geladen. Dabei befindet sich dieser Code in externen Dateien, welche in dem Programmordner oder in bestimmten Suchordnern von Windows(z.B. C:\Windows\System 32\) befinden.
    Falls Windows solche Dateien beim Starten des Programmes nicht findet, dann kann das programm nicht gestartet werden, da dann einige Funktionen nicht vorhanden sind.

    Dll's haben den Vorteil, dass sie nur einmal im Speicher sind, egal wie viele Programme diese benutzen, aber der Compiler weiß nicht, welche Funktionen die Dll besitzt, sodass die Def-Datei eine Rolle spielt, da sie dem Compiler sagt, welche Funktionen in der Dll sind und welche Argumente sie benötigen.

    Um jetzt dein Projekt zu kompilieren zu können musst du die sqlite3.def zu deinem Projet hinzufügen:
    Project => Build Option... => Linker settings und dann die Datei zu den gelinkten Bibliotheken hinzufügen

    Ich habe diese Lösung zwar nicht getestet, da ich MSVC++ benutze, aber ich habe es so in einem Forum gefunden.

    Gruß pueschel
  4. Hallo makawa,

    um SQLite in Dein Programm zu integrieren benötigst Du eigentlich gar keine Dll. Du kannst Dir hier einfach den Quellcode holen. Dazu nimmst Du den obersten Link (sqlite-amalgamation-3071502.zip) und fügst die enthaltene .c und .h Dateien einfach Deinem Projekt hinzu. Dann war es das eigentlich schon.
    Fall Du doch mal mit Dlls zu tun hast:
    Soweit ich weis kann GCC/MinGW direkt gegen Dlls linken. D.h. Du gibst die Dll einfach dort an wo Du auch die .a Dateien für den Linker angibst. Die Dll muss dann nur irgenwo liegen, wo der Linker sie auch findet.
    Zu den Datei-Typen:
    Eine .a Datei ist eine Bibliothek die statisch verlinkt wird. Es gibt .a Archive, welche den vollständigen Code beinhalten und es gibt welche, die nur den Code zum Import einer externen Bibliothek (.dll unter Window, .so unter Linux) beinhalten. Die .a Archive für die Windows-API gehören zum zweiten Typ.
    Eine .def Datei beinhaltet im allgemeinen nur eine Auflistung der von einer Dll exportierten Funktionen. Diese wird aber eigentlich nur von Visual Studio Entwicklungsumgebung verwendet. Eine .lib Datei ist das Analogon zur .a Datei für Visual Studio.
    Allerdings kann MinGW auch .lib Dateien Linken.

    Weitere Links zum Thema:
    http://www.mingw.org/wiki/CreateImportLibraries
    http://www.mingw.org/wiki/Specify_the_libraries_for_the_linker_to_use
  5. Autor dieses Themas

    makawa

    makawa hat kostenlosen Webspace.

    Erstmal vielen Dank an euch Beide für die Antworten. Sie haben mir sehr geholfen!

    @darkpandemic
    Ich habe das mit dem Quellcode ausprobiert, jedoch bekomme ich nur durch das einbinden der Datei sqlite3.h schon folgende Fehler:
    obj/Debug/sqlite3.o||In function `pthreadMutexAlloc':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|18025|undefined reference to `pthread_mutexattr_init'|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|18026|undefined reference to `pthread_mutexattr_settype'|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|18028|undefined reference to `pthread_mutexattr_destroy'|
    obj/Debug/sqlite3.o||In function `pthreadMutexTry':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|18157|undefined reference to `pthread_mutex_trylock'|
    obj/xxx/sqlite3.o||In function `unixDlOpen':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|28402|undefined reference to `dlopen'|
    obj/Debug/sqlite3.o||In function `unixDlError':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|28416|undefined reference to `dlerror'|
    obj/xxx/sqlite3.o||In function `unixDlSym':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|28442|undefined reference to `dlsym'|
    obj/Debug/sqlite3.o||In function `unixDlClose':|
    /home/xxx/Dokumente/c++/sqlite01/sqlite3.c|28447|undefined reference to `dlclose'|
    Kann das vielleicht daran liegen dass ich einen .c file in einem C++ Projekt verwende?
  6. Hallo makawa,

    ich habe mir mal das aktuelle Code::Blocks heruntergeladen und es ausprobiert.
    Mein Vorgehen war wie folgt:
    1. Neues Projekt angelegt Konsole/C++
    2. Die Dateien sqlite3.c und sqlite3.h in den Projektordner kopiert. Also direkt neben main.cpp
    3. Über den Menüpunkt 'Project -> Add Files...' die beiden Dateien für die Debug und Release Konfiguration hinzugefügt.
    4. Projekt erstellt.
    Lief alles ohne Probleme. Auch das Öffnen und Schließen einer In-Memory Datenbank funktionierte.
    Aber mir scheint, dass Du jetzt auf Linux unterwegs bist. Zumindest schließe ich das aus den Pfaden und aus den fehlenden Referenzen.
    Füge mal zu Deinen Linkeroptionen folgendes hinzu:
    -ldl -lpthread
    Auf den ersten Blick würde ich sagen, dass es damit funktionieren sollte.
  7. Autor dieses Themas

    makawa

    makawa hat kostenlosen Webspace.

    Vielen vielen Danke.
    Unter Windows hat, wie bei dir, alles sofort funktioniert, unter Linux nachdem ich die Optionen gesetzt habe!
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!