sqlite3 unter linux mit c/c++ kompilieren



  • hi,
    habe folgende situation:
    Mit KDevelop habe ich ein Projekt erstellt, dort habe ich die sqlite3.h eingebunden. Das tut auch, allerdings wenn ich jetzt den sample-quelltext von sqlite3.org kompilieren will, dann gibt er mir folgendes:

    /home/mollitz/Projekte/test/src/test.cpp:55: undefined reference to `sqlite3_open'
    /home/mollitz/Projekte/test/src/test.cpp:57: undefined reference to `sqlite3_errmsg'
    /home/mollitz/Projekte/test/src/test.cpp:58: undefined reference to `sqlite3_close'
    /home/mollitz/Projekte/test/src/test.cpp:61: undefined reference to `sqlite3_exec'
    /home/mollitz/Projekte/test/src/test.cpp:64: undefined reference to `sqlite3_free'
    /home/mollitz/Projekte/test/src/test.cpp:66: undefined reference to `sqlite3_close'
    

    ich weiss nimmer weiter.

    also wer hilfe hat, bitte melden!
    danke



  • Hallo,

    schau dir mal diesen Thread an. Bezieht sich zwar auf SQLite in Kombination mit einem Wrapper, kann man aber auch ganz leicht auf das pure SQLite anwenden. Außerdem ist der Einsatz eines Wrappers sehr sinnvoll wenn man C++ Programme schreiben will, da das C/C++ Interface von SQLite eher an C angelehnt ist.

    Gruß



  • diesen thread hatte ich schon komplett durchgelesen, allerdings will ich das ganze gleich mit der library machen.
    also es ist ja offesichtlich so dass er bloss die headerinformationen für die sqlite3 funktionen hat. aber ich hab den rest ja in der bibliothek.
    also muss ich entweder dem linker klar machen, dass er die bibliothek dazulinken soll, oder sie zur laufzeit dazunimmt.



  • Hallo,

    möchtest du jetzt SQLite, oder SQLite mit Wrapper benutzen?



  • also ich weiss leider nicht was ein wrapper ist!
    mein ziel ist diesen fehler möglcihst schnell zu beseitigen, eine kurze kompilierungszeit zu haben und später die datenbank ganz normal mit sql ansprechen zu können.



  • Ein Wrapper ist eine Art Schicht über der Datenbank. Das C/C++ Interface von SQLite sieht eher nach C als nach C++ aus. Wenn du mit schönem C++ programmieren willst, solltest du also einen Wrapper verwenden. Die Compilierungszeit kann ein bisschen länger sein, aber bei der Ausführung solltest du keine Einbußen hinnehmen müssen.



  • ja, also wenns nicht umständlich ist, nehm ich auch einen wrapper =), allerdings würd ich noch gern wissen wies geht 😃



  • Hallo,

    den Wrapper gibts hier: http://www.alhem.net/project/sqlite/index.html. Du lädst dir das Archiv herunter und und zusätzlich von SQLite noch das hier: http://www.sqlite.org/sqlite-source-3_3_17.zip. Dann entpackst du alles in einen Ordner und führst dieses Shellscript aus:

    #! /bin/sh
    #Erstmal alle c/cpp-Dateien kompilieren
    for source in *.cpp *.c
    do
        gcc -I. -c $source
    done
    
    # und dann linken
    g++ -shared -o libsqlitewrapped.so *.o
    
    # und alle überflüssigen objectcode-files löschen
    
    rm *.o
    

    Jetzt die Header nach /usr/include und die Bibliothek nach /usr/lib kopieren und dann kannst du dein Programm mit dem Befehl

    g++ Quelldatei.cpp -o Programm -lsqlitewrapped -lpthread -dld
    

    kompilieren.

    Viel Spaß

    P.S. Ein Tutorial gibts auf der Seite von alhelm auch!



  • prima danke!
    ach ja eine sache wär da noch:
    ich muss ja jetzt jedes mal wenn ich projekte mit sqlite mach, noch diese sachen hinterdrannhängen (an den compileraufruf).
    allerdings arbeite ich mit qdevelop und kdevelop. woher wollen die des wissen?

    ach und noch was!
    man muss ja den inhalt des ordners, der von dem archiv von alhelm rauskommt, in den ordner kopieren wo auch des skript ausgeführt wird und so sqlite3.h und sqlite3.c liegen !?



  • mollitz schrieb:

    prima danke!
    ach ja eine sache wär da noch:
    ich muss ja jetzt jedes mal wenn ich projekte mit sqlite mach, noch diese sachen hinterdrannhängen (an den compileraufruf).
    allerdings arbeite ich mit qdevelop und kdevelop. woher wollen die des wissen?

    Kann ich dir nicht sagen, ich kompiliere per Hand.

    mollitz schrieb:

    ach und noch was!
    man muss ja den inhalt des ordners, der von dem archiv von alhelm rauskommt, in den ordner kopieren wo auch des skript ausgeführt wird und so sqlite3.h und sqlite3.c liegen !?

    Was willst du damit sagen?



  • es gibt 2 archive:
    das von achalm
    und das von sqlite
    aus dem sqlite kommen 2 dateien raus(sqlite3.c und sqlite3.h) aus dem archiv von der achalm-hp kommt ein ordner raus.
    soll ich da jetzt die dateien oder den ordner verwenden? (also die dateien aus dem ordner rausnehmen oder drinn lassen)



  • Du sollst sowohl die Dateien von SQLite, als auch die Dateien des Wrappers in einen Ordner kopieren. Welcher Ordner das ist, ist egal, Hauptsache sie sind alle zusammen. Dann kopierst du noch das Shellskript in den Ordner und führst es aus.

    P.S.: Denk dran, dass das Skript eine dynamische Bibliothek erzeugt, d.h. du musst jedem, dem du dein Programm gibst die Bibliothek mitliefern.



  • ja, is klar!
    danke dann!



  • so, hab jetzt mal das mit dem skript gemacht:
    fehler:
    sqlite3test.cpp:26:30: error: libsqlitewrapped.h: No such file or directory
    sqlite3test.cpp: In function »int main(int, char**)«:
    sqlite3test.cpp:31: Fehler: »Database« wurde nicht deklariert
    sqlite3test.cpp:31: Fehler: expected ;' before »mutex« sqlite3test.cpp:32: Fehler: »StderrLog« wurde in diesem Gültigkeitsbereich nicht definiert sqlite3test.cpp:32: Fehler: expected;' before »log«
    sqlite3test.cpp:33: Fehler: »Database« wurde in diesem Gültigkeitsbereich nicht definiert
    sqlite3test.cpp:33: Fehler: expected ;' before »db« sqlite3test.cpp:34: Fehler: »Query« wurde in diesem Gültigkeitsbereich nicht definiert sqlite3test.cpp:34: Fehler: expected;' before »q«
    sqlite3test.cpp:37: Fehler: »q« wurde in diesem Gültigkeitsbereich nicht definiert
    sqlite3test.cpp:48: Fehler: »string« ist kein Element von »std«
    sqlite3test.cpp:48: Fehler: expected `;' before »name«
    sqlite3test.cpp:49: Fehler: »name« wurde in diesem Gültigkeitsbereich nicht definiert

    wozu braucht man eig. den wrapper?
    man kann doch auch die sqlite funktionen als friend-funktionen in ner klasse sqlite verwenden, dann kann man die als ganz normale methoden aufrufen!



  • Lies doch die Fehlermeldungen. Der Compiler spricht doch mit dir.

    sqlite3test.cpp:26:30: error: libsqlitewrapped.h: No such file or directory



  • rüdiger schrieb:

    Lies doch die Fehlermeldungen. Der Compiler spricht doch mit dir.

    sqlite3test.cpp:26:30: error: libsqlitewrapped.h: No such file or directory

    Genau, und wenn er jetzt nicht nur ließt, sondern auch noch etwas denkt, dann kommt er vielleicht darauf, dass er statt des Headers libsqlite.h einfach alle anderen Header einbinden muss. 💡



  • nö darauf wär ich nicht gekommen =)!
    @rüdiger!
    die frage die ich durch meinen post ausdrücken wollte war:
    woher bekomme ich libsqlite3.h ? ^^



  • mollitz schrieb:

    woher bekomme ich libsqlite3.h ? ^^

    Eigentlich sollte es ein Makefile geben, dass dir diese Datei erstellt. Ich hab die Benutzung dessen allerdings auch noch nicht verstanden und empfehle dir deshalb, einfach die anderen Header einzubinden. Evtl. funktioniert es, wenn du dir eine Datei erstellst, diese libsqlite3.h nennst und diesen Inhalt einfügst:

    #include <sqlite3.h>
    #include <Query.h>
    //usw.
    

    Ist aber nur eine Idee. Es funktioniert genauso, und sicherlich auch viel unproblematischer, wenn du einfach meinen ersten Tipp befolgst.

    Gruß



  • 1. mal warum die dinger mit <> includieren ? da findet er bei mir ja gar nichts!
    also mit anführungsstrichen kommt bei mir folgender fehler:

    Query.h:51: Fehler: expected `)' before »&« token
    Query.h:54: Fehler: expected `)' before »&« token
    Query.h:60: Fehler: ISO-C++ verbietet Deklaration von »Database« ohne Typ
    Query.h:60: Fehler: expected »;« before »&« token
    Query.h:145: Fehler: ISO-C++ verbietet Deklaration von »Database« ohne Typ
    Query.h:145: Fehler: expected »;« before »&« token
    Query.h:146: Fehler: »Database« wurde nicht deklariert
    Query.h:146: Fehler: ISO-C++ verbietet Deklaration von »OPENDB« ohne Typ
    Query.h:146: Fehler: expected »;« before »*« token
    Query.h: In copy constructor »Query::Query(const Query&)«:
    Query.h:138: Fehler: Klasse »Query« hat keinen Feldnamen »m_db«
    Query.h:138: Fehler: »const class Query« hat kein Element namens »GetDatabase«
    sqlite3test.cpp: In function »int main(int, char**)«:
    sqlite3test.cpp:38: Fehler: keine passende Funktion für Aufruf von »Query::Query(Database&)«
    Query.h:138: Anmerkung: Kandidaten sind: Query::Query(const Query&)
    

Anmelden zum Antworten