SQLite einbinden "undefined reference"
-
Hallo,
Ich möchte SQLite3 in einem Programm nutzen und habe deshalb den Quellcode davon heruntergeladen und in einen unterordner meines projektes entpackt. Mit Code::Blocks habe ich dann eine Makefile zum erzeugen von libsql.a angelegt, die auch soweit funktioniert.
Wenn ich jetzt aber meine Makefile ausführe bekomme ich nur das folgende zurück:
cc main.o -o main main.o: In function `main': main.cpp:(.text+0xe): undefined reference to `std::cout' main.cpp:(.text+0x13): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.cpp:(.text+0x18): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' main.cpp:(.text+0x20): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' main.cpp:(.text+0x38): undefined reference to `sqlite3_open' main.cpp:(.text+0x4b): undefined reference to `std::cout' main.cpp:(.text+0x50): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.cpp:(.text+0x5c): undefined reference to `sqlite3_errmsg' main.cpp:(.text+0x68): undefined reference to `sqlite3_finalize' main.cpp:(.text+0x74): undefined reference to `sqlite3_close' main.o: In function `__static_initialization_and_destruction_0(int, int)': main.cpp:(.text+0xac): undefined reference to `std::ios_base::Init::Init()' main.cpp:(.text+0xbb): undefined reference to `std::ios_base::Init::~Init()' main.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0' collect2: error: ld returned 1 exit status make: *** [main] Error 1
Ich hab überhaupt keine Idee, woran das liegen könnte und auch keine Idee, was ich noch probieren könnte.
Für jede Hilfe bin ich extrem dankbar!
-
Vielleicht versucht er die Datei main zu bauen. Mit eingebauten Regeln?
Ich glaube, es sollte eher in diese Richtung gehen.
.PHONY: all all: main main: main.o lib/sqlitelib.a $(CXX) $(CFLAGS) -o main main.o $(linked) lib/sqlitelib.a: $(make_sqlite3) main.o: main.cpp $(CXX) -c -o main.o main.cpp
-
Da passiert genau das selbe. Zusätzlich bekomme ich beim ausführen der Makefile noch folgenden Fehler von der Makefile im SQLite-Ordner:
g++ -c -o main.o main.cpp test -d obj/Release || mkdir -p obj/Release gcc -Wall -O2 -c shell.c -o obj/Release/shell.o gcc -Wall -O2 -c sqlite3.c -o obj/Release/sqlite3.o ar rcs `pwd`/libsqlite.a obj/Release/shell.o obj/Release/sqlite3.o mkdir: invalid option -- 'W' Try `mkdir --help' for more information. make: *** [lib/sqlitelib.a] Error 1
Deswegen habe ich jetzt einfach die SQLite Makefile einzeln ausgeführt und danach die eigentliche. (Wenn ich genau den Befehl nehme, den ich auch als $(make_sqlite3) habe, bekomme ich komischerweise keinen Fehler beim Kompilieren von SQLite.).
Und dann kommt wieder "undefined reference".
-
Ich habe jetzt ein Script geschrieben, welches die beiden Makefiles hintereinander ausführt. Dazu habe ich noch die $(make_sqlite) Sachen aus der Makefile gelöscht. Und ich habe das mit dem Ordner (obj/Release) gelöscht, weil wget da Probleme gemacht hat.
Jetzt bekomme ich folgenden Output:
Making SQLite3... gcc -Wall -O2 -c shell.c -o shell.o gcc -Wall -O2 -c sqlite3.c -o sqlite3.o ar rcs libsqlite.a shell.o sqlite3.o Done. Will now build main program. g++ -c -o main.o main.cpp g++ -Wall -o main main.o -Llib/sqlite3/ -lsqlite lib/sqlite3//libsqlite.a(sqlite3.o): In function `pthreadMutexTry': sqlite3.c:(.text+0x6385): undefined reference to `pthread_mutex_trylock' lib/sqlite3//libsqlite.a(sqlite3.o): In function `pthreadMutexAlloc': sqlite3.c:(.text+0xd364): undefined reference to `pthread_mutexattr_init' sqlite3.c:(.text+0xd371): undefined reference to `pthread_mutexattr_settype' sqlite3.c:(.text+0xd384): undefined reference to `pthread_mutexattr_destroy' lib/sqlite3//libsqlite.a(sqlite3.o): In function `unixDlError': sqlite3.c:(.text+0x2b3d9): undefined reference to `dlerror' lib/sqlite3//libsqlite.a(sqlite3.o): In function `unixDlClose': sqlite3.c:(.text+0x6874): undefined reference to `dlclose' lib/sqlite3//libsqlite.a(sqlite3.o): In function `unixDlSym': sqlite3.c:(.text+0x6887): undefined reference to `dlsym' lib/sqlite3//libsqlite.a(sqlite3.o): In function `unixDlOpen': sqlite3.c:(.text+0x6899): undefined reference to `dlopen' collect2: error: ld returned 1 exit status make: *** [main] Error 1
Also hat sich im Prinzip nichts geändert.
-
Vielleicht noch
-lpthread
an den Linkerlauf machen.
-
Ich habe jetzt ein Testprogramm aus dem Forum genommen (Der Thread dazu), und es auf sqlite3 umgeschrieben. (Da fehlte bei jeder funktion die 3 )
Und jetzt kommt das:
g++ -c -o main.o main.cpp main.cpp: In function ‘int main(int, char**)’: main.cpp:28:56: error: too many arguments to function ‘int sqlite3_open(const char*, sqlite3**)’ In file included from main.cpp:3:0: lib/sqlite3/sqlite3.h:2788:16: note: declared here main.cpp:28:56: error: invalid conversion from ‘int’ to ‘sqlite3*’ [-fpermissive] make: *** [main.o] Error 1
Hier ist die main.cpp
-
k40s schrieb:
Ich habe jetzt ein Testprogramm aus dem Forum genommen (Der Thread dazu), und es auf sqlite3 umgeschrieben. (Da fehlte bei jeder funktion die 3 )
Das liegt daran, dass das Beispiel wohl für sqlite2 geschrieben ist.
k40s schrieb:
Und jetzt kommt das:
g++ -c -o main.o main.cpp main.cpp: In function ‘int main(int, char**)’: main.cpp:28:56: error: too many arguments to function ‘int sqlite3_open(const char*, sqlite3**)’ In file included from main.cpp:3:0: lib/sqlite3/sqlite3.h:2788:16: note: declared here main.cpp:28:56: error: invalid conversion from ‘int’ to ‘sqlite3*’ [-fpermissive] make: *** [main.o] Error 1
Hier ist die main.cpp
Der Link ist nicht mehr gültig. Du hast die main.cpp verschoben. Aber auch die verschobene Version unter ...teardrop/server/main.cpp ist ganz bestimmt nicht die Version, aus der der Fehler kommt. Die vom Fehler referenzierte Zeile 28 ist mitten im Kommentar.
Also wenn Du noch Hilfe benötigst, dann solltest Du sie noch mal richtig stellen. So kann man nur raten.
Übrigens empfehle ich Dir einen Wrapper zu verwenden, da die API von sqlite3 wie auch von anderen Datenbanken recht schwierig ist. Ich habe mal einen geschrieben, der ganz einfach zu verwenden ist: Tntdb. Findest Du möglicherweise auch in deinem Source-Repo. Zumindest bei Debian und Debian basierten Systemen wie Ubuntu kannst Du das direkt über die Softwareverwaltung installieren.
-
Ich hab vergessen, das abzuschließen. Ich hab es mittlerweile hinbekommen.
Die zeile 28 stimmt auch nicht mehr, weil in der zwischenzeit wieder etwas dazugekommen ist.
Es lag einmal daran, dass ich die DQLite Bibliothek falsch eingebunden hab (anscheinend jedenfalls)
Und ich habe noch -lpthread zum linker hinzugefügt.