SQLite - wie benutze ich das?
-
Hallo,
ich wollte mich heute eigentlich in SQLite einarbeiten, bin aber schon bei der Einrichtung hängen geblieben.
So wie ich das verstanden habe, muss ich in meinem Programm den Header sqlite3.h einbinden und dann gegen die lib sqlite3.lib linken. Diese lib kann ich aber nirgends finden und ich weiß nicht, wie man sie sich selbst erstellen kann. Ich wäre dankbar, wenn mir da jemand auf die Sprünge helfen könnte (ich verwende den gcc). Zum fertigen Programm muss dann unter Windows noch eine DLL hinzugefügt werden (und unter Linux?). Kann mir jemand sagen, ob ich das soweit richtig verstanden habe?
Die sog. C/C++ API von SQLite sieht mir eher nach C als nach C++ aus. Deshalb ist es wahrscheinlich ratsam einen Wrapper zu verwenden. Ich bin auf meiner Suche auf diesen hier gestoßen: http://www.alhem.net/project/sqlite/index.html. Kann mir jemand sagen ob der zu empfehlen ist und mir vielleicht kurz verraten, wie ich ihn verwenden kann?
Ich weiß, dass derartige Anfängerfragen wahrscheinlich sehr störend sind, aber leider ist die Dokumentation nicht wirklich hilfreich.Danke
-
Du brauchst auch die sqlite3.c und sqlite3.h aus
http://www.sqlite.org/sqlite-source-3_3_17.zip.
Eine Lib ist eigentlich nur ein Archiv von Objektdateien. Wenn Du mit Deinen Compilern noch nicht so viel Erfahrung hast dann kannst Du alle Dateien (alle *.c *.h *.cpp von sqllitewrapped, und die zwei von sqlite) auch einfach in das Projektverzeichnis kopieren und mitübersetzen und einbinden lassen. Mit Libs und shared libs und DLLs und Makefiles kannst Du Dich dann später anfreunden.Nimm das Projektverzeichnis mit in den Standardpfad auf:
gcc/g++: -I.
msbc (cl) /I.wegen der <...> Direktiven.
In sqlite3test.cpp ändere dann die includes wie folgt
#include <stdio.h> #include <sqlite3.h> //#include <libsqlitewrapped.h> #include <IError.h> #include <Database.h> #include <Query.h> #include <StderrLog.h> #include <SysLog.h>
Dann klappts.
Viel Spass
Grüsse
*this
P.S.: ":memory:" statt "test.db" erzeugt eine temporäre DB im Speicher - ganz nett zum Testen.
-
Gast++ schrieb:
Nimm das Projektverzeichnis mit in den Standardpfad auf:
gcc/g++: -I.
Wie geht das? Ein
g++ -l /pfad/zu/den/headern/
gibt bei mir nur Errors, dass die Header nicht gefunden werden. Daher wollte ich mir abhelfen in dem ich den Quellcode so abgeändert habe
#include <stdio.h> #include "sqlite3.h" //#include "libsqlitewrapped.h" #include "IError.h" #include "Database.h" #include "Query.h" #include "StderrLog.h" #include "SysLog.h" int main(int argc,char *argv[]) { Database::Mutex mutex; // not really necessary here at all StderrLog log; Database db(mutex, "test3.db", &log); Query q(db); // create a test3 table q.execute("create table test3 ( num integer, name string )"); // fill test3 with some data q.execute("insert into test3 values(1, 'Anders')"); q.execute("insert into test3 values(2, 'Grymse')"); // retrieve data q.get_result("select * from test3"); while (q.fetch_row()) { long num = q.getval(); std::string name = q.getstr(); printf("#%ld: %s\n", num, name.c_str()); } q.free_result(); // return 0; }
Daraufhin wollte ich ihn mit dem Befehl
g++ sqlite3test.cpp -o test
kompilieren doch das einzige wozu das geführt hat ist diese Ausgabe:
/tmp/ccz3Ob6p.o: In function `main': sqlite3test.cpp:(.text+0x30): undefined reference to `Database::Mutex::Mutex()' sqlite3test.cpp:(.text+0x80): undefined reference to `Database::Database(Database::Mutex&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, IError*)' sqlite3test.cpp:(.text+0xcc): undefined reference to `Query::Query(Database&)' sqlite3test.cpp:(.text+0x12a): undefined reference to `Query::execute(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' sqlite3test.cpp:(.text+0x1bf): undefined reference to `Query::execute(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' sqlite3test.cpp:(.text+0x254): undefined reference to `Query::execute(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' sqlite3test.cpp:(.text+0x2e9): undefined reference to `Query::get_result(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' sqlite3test.cpp:(.text+0x355): undefined reference to `Query::getval()' sqlite3test.cpp:(.text+0x371): undefined reference to `Query::getstr()' sqlite3test.cpp:(.text+0x41e): undefined reference to `Query::fetch_row()' sqlite3test.cpp:(.text+0x434): undefined reference to `Query::free_result()' sqlite3test.cpp:(.text+0x44c): undefined reference to `Query::~Query()' sqlite3test.cpp:(.text+0x468): undefined reference to `Query::~Query()' sqlite3test.cpp:(.text+0x47b): undefined reference to `Database::~Database()' sqlite3test.cpp:(.text+0x494): undefined reference to `Database::~Database()' sqlite3test.cpp:(.text+0x4a7): undefined reference to `Database::Mutex::~Mutex()' sqlite3test.cpp:(.text+0x4cc): undefined reference to `Database::Mutex::~Mutex()' /tmp/ccz3Ob6p.o: In function `StderrLog::StderrLog()': sqlite3test.cpp:(.text._ZN9StderrLogC1Ev[StderrLog::StderrLog()]+0x12): undefined reference to `vtable for StderrLog' collect2: ld gab 1 als Ende-Status zurück
Also ich bin damit echt am Ende meines Lateins. Vermutlich kann ich jetzt keine Datenbank nutzen weil ich einfach zu blöd bin um sie einzurichten
.
Helft mir bitte weiter!
Danke
-
basti33 schrieb:
Gast++ schrieb:
Nimm das Projektverzeichnis mit in den Standardpfad auf:
gcc/g++: -I.g++ -l /pfad/zu/den/headern/
[...]Also ich bin damit echt am Ende meines Lateins. Vermutlich kann ich jetzt keine Datenbank nutzen weil ich einfach zu blöd bin um sie einzurichten
.
Helft mir bitte weiter!
DankeCool bleiben!
Schau Dir erstmal beide Codestellen genau an. "-I." != "-l"!
("Minus-Grosses 'i'-Punkt")Und wenn ich Dir das schon so genau beschreibe, dann mach es bitte auch so;
von "..." inlcudes hatte ich nichts geschrieben; das löst das Problem nämlich nur für das Test-Programm aber nicht für die Bibliotheksdateien!#! /bin/sh #Erstmal alle c/cpp-Dateien kompilieren for source in *.cpp *.c do gcc -I. -c $source done # und dann linken g++ -o a.out *.o
(Ich hab hier grad kein Unix; findet jemand einen Syntax-Fehler?)
Unter Win/Cygwin entsprechend mit cmd-Syntax (oder unterstützt das sh-Syntax?).Grüsse
*this
Grüsse
-
Also, ich habe hier ein Verzeichnis, in dem sich diese Dateien befinden:
Database.cpp IError.h Query.h sqlite3.h StderrLog.h Database.h Makefile sqlite-3.3.17.so sqlite3.sh SysLog.cpp gpl.txt Query.cpp sqlite3.c StderrLog.cpp SysLog.h
Wenn ich jetzt dein Shell-Skript ausführe kommt diese Meldung zustande:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function
_start': (.text+0x18): undefined reference to
main'
sqlite3.o: In functiontestThreadLockingBehavior': sqlite3.c: (.text+0x752c): undefined reference to
pthread_create'
sqlite3.c: (.text+0x7554): undefined reference topthread_create' sqlite3.c: (.text+0x7567): undefined reference to
pthread_join'
sqlite3.c: (.text+0x757a): undefined reference topthread_join' sqlite3.o: In function
sqlite3UnixDlopen':
sqlite3.c: (.text+0x8b8e): undefined reference todlopen' sqlite3.o: In function
sqlite3UnixDlsym':
sqlite3.c: (.text+0x8ba8): undefined reference todlsym' sqlite3.o: In function
sqlite3UnixDlclose':
sqlite3.c: (.text+0x8bbb): undefined reference todlclose' sqlite3.o: In function
sqlite3UnixThreadSpecificData':
sqlite3.c: (.text+0x8e1d): undefined reference topthread\_key\_create' sqlite3.c: (.text+0x8e53): undefined reference to
pthread_getspecific'
sqlite3.c: (.text+0x8eae): undefined reference topthread_setspecific' sqlite3.c: (.text+0x8f0f): undefined reference to
pthread_setspecific'
collect2: ld gab 1 als Ende-Status zurückIrgendwas läuft da falsch. Außerdem versteh ich nicht so ganz wie ich deinen Befehl anwenden soll.
g++ -I. /home/basti/sqlite/
geht nämlich nicht, da kommt als Fehlermeldung "File Format not recognized".
Danke
P.S.: Wieso gibt es eigentlich keine IError.c?
-
basti33 schrieb:
g++ -I. /home/basti/sqlite/
Hatte ich geschrieben dass Du das so aufrufen sollst?
Wohl kaum.basti33 schrieb:
Wieso gibt es eigentlich keine IError.c?
???
Wie wärs denn wenn Du in die IError.h mal reinschautest?
"pure virtual" erfordert nicht soviel Implementierung.Also :
Bleib bei meinem Shellskript und ersetz die letzte Zeile mitg++ -o a.out *.o -ldl -lpthread
Grüsse
*this
-
Gast++ schrieb:
Also :
Bleib bei meinem Shellskript und ersetz die letzte Zeile mitg++ -o a.out *.o -ldl -lpthread
Führt leider zu dieser Ausgabe
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld gab 1 als Ende-Status zurück
Vielleicht wäre es doch klüger, die vorgefertigte .so zum Projekt dazuzulinken bloß wie mach ich das?
Danke
-
basti33 schrieb:
Gast++ schrieb:
Also :
Bleib bei meinem Shellskript und ersetz die letzte Zeile mitg++ -o a.out *.o -ldl -lpthread
Führt leider zu dieser Ausgabe
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld gab 1 als Ende-Status zurück
Vielleicht wäre es doch klüger, die vorgefertigte .so zum Projekt dazuzulinken bloß wie mach ich das?
Danke
Nein, es wäre klüger wnn Du's nicht immer anders machst als ich es Dir sage.
Wo ist denn bitte die sqlite3test.cpp in Deinem Projektverzeichnis?Hatte ich nicht geschrieben dass Du _ALLE_ C/C++ Dateien aus dem Paket dort hinkopieren sollst?
Grüsse
*this
P.S.:
.so zum Projekt dazuzulinken bloß wie mach ich das?
Genau wegen der Frage wäre das nicht klüger
-
Gast++ schrieb:
Wo ist denn bitte die sqlite3test.cpp in Deinem Projektverzeichnis?
Ah, ich schäme mich. Danke, jetzt gehts.
Wenn ich dich richtig verstanden habe muss ich jetzt bei jedem meiner Programme, die SQLite verwenden, diese Dateien hinzufügen, oder?
Gast++ schrieb:
Genau wegen der Frage wäre das nicht klüger
Vielleicht könntest du mir doch noch verraten wie man es mit der Library macht (wie es theoretisch funktioniert versteh ich ja, aber wie man das mit g++ macht eben nicht). Ich denke, dass das doch ein bisschen praktischer wäre.
Danke
-
basti33 schrieb:
Vielleicht könntest du mir doch noch verraten wie man es mit der Library macht (wie es theoretisch funktioniert versteh ich ja, aber wie man das mit g++ macht eben nicht). Ich denke, dass das doch ein bisschen praktischer wäre.
Für eine statische Lib steht das eigentlich im Makefile ("ar","ranlib").
Allerding taugt das Makefile imo sonst nicht viel.Am besten Du setzt Dich erstaml etwas mit der Präprozessor/Compiler/Linker/make Syntax auseinander; bis Du Dir ein eigenes Makefile scheiben kannst.
Zu "Shared Libraries" findest Du vieles bei Google und auch mit "man"/"info" gcc.
Grüsse und viel Spass mit SQLite!
*this