[Erledigt] Mit C++ auf lokale Datenbank zugreifen
-
Ganz einfach. Du googlest nach ubuntu+mysql+c++ und folgst den Anweidungen, die du findest. Solltest du mit einem speziellen Schritt Probleme haben, kannst du gerne mit einer konkreten Frage hier wieder aufschlagen.
-
Sämtliche Anleitungen die ich gefunden habe bin ich bereits durchgegangen, aber nochmal als Zusammenfassung was ich bereits gemacht habe.
Pakete ich bereits mittels apt-get installiert habe:
- libmysqlcppconn-dev
- libmysqlclient-devZusätzlich habe ich mir hier das Archiv (Debian Linux) rausgezogen und den Inhalt daraus in mein /usr/ Verzeichnis entpackt.
Dann habe ich außerdem wie hier die Option beim Compiler noch mit angegeben.
Ich bekomme aber nach wie vor die Fehlermeldung "undefined refernce to mysql_init" bzw die gleiche für mysql_real_connect.
-
Warum installierst du das C++ API und verwendest dann das C API im Code? Vermutlich bindest du dann nicht die C Libs dazu.
-
Wie genau kompilierst du?
Es müsste sowas in der Art sein:
$ g++ $(mysql_config --libs --cflags) -Wall -o mybinary mycode.cpp
Was wird dabei ausgegeben?
-
Schau Dir mal tntdb an. Damit ist das ganz einfach. Du verwendest ja bereits Linux. Und tntdb findest Du auch in den Repos.
-
manni66 schrieb:
Warum installierst du das C++ API und verwendest dann das C API im Code? Vermutlich bindest du dann nicht die C Libs dazu.
Wie sähen denn die C++ APIs aus? Habe wie gesagt nur das gefunden was ich gepostet habe und das kam bei einer google suche mit "C++" raus..
lagalopex schrieb:
Wie genau kompilierst du?
Es müsste sowas in der Art sein:
$ g++ $(mysql_config --libs --cflags) -Wall -o mybinary mycode.cpp
Was wird dabei ausgegeben?
Ich kompiliere mit NetBeans. Schaue mal eben ob ich den genauen Aufruf im Log finde..
/edit:
der Aufrufg++ -Iinclude -lmysqlclient -lmysqlcppconn -o dist/Debug/GNU-Linux-x86/mediaserver build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/database.o
und die Ausgabe:
/home/phost/NetBeansProjects/MediaServer/database.cpp:15: undefined reference to `mysql_init' /home/phost/NetBeansProjects/MediaServer/database.cpp:16: undefined reference to `mysql_real_connect'
-
phost schrieb:
manni66 schrieb:
Warum installierst du das C++ API und verwendest dann das C API im Code? Vermutlich bindest du dann nicht die C Libs dazu.
Wie sähen denn die C++ APIs aus? [...]
-
Das Manual habe ich doch schon längst so gut ich es hinbekommen habe durchgearbeitet. Sonst wäre ich vermutlich kaum hier und müsste Fragen stellen.
-
Du hast aber auch ein 32 bit System, oder?
Und nur mal aus Interesse, funktioniert der folgende Aufruf, bzw was wird dabei ausgegeben?
$ g++ $(mysql_config --libs --cflags) -Wall -o mybinary *.cpp
Oder auch nur mal alleine die Ausgabe von:
$ mysql_config --libs --cflags
-
phost@phost-laptop:~$ sudo mysql_config --libs --cflags -L/usr/lib/i386-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -g
phost@phost-laptop:~$ sudo g++ $(mysql_config --libs --cflags) -Wall -o /home/phost/NetBeansProjects/mediaserver /home/phost/NetBeansProjects/MediaServer/main.cpp /home/phost/NetBeansProjects/MediaServer/main.cpp: In function ‘int main(int, char**)’: /home/phost/NetBeansProjects/MediaServer/main.cpp:36:15: warning: unused variable ‘db’ [-Wunused-variable] /home/phost/NetBeansProjects/MediaServer/main.cpp:38:44: warning: variable ‘control_socket’ set but not used [-Wunused-but-set-variable] /tmp/ccZFmOTS.o: In function `main': /home/phost/NetBeansProjects/MediaServer/main.cpp:36: undefined reference to `database::database(char const*, char const*, char const*, char const*, char const*)' collect2: ld returned 1 exit status
Und ja ich bin auf einem 32-bit System unterwegs
-
Du musst schon beide cpp Dateien angeben. (Also main.cpp und database.cpp)
Und das sudo sollte nicht nötig sein.
-
phost@phost-laptop:~$ g++ $(mysql_config --libs --cflags) -Wall -o /home/phost/NetBeansProjects/mediaserver /home/phost/NetBeansProjects/MediaServer/main.cpp /home/phost/NetBeansProjects/MediaServer/database.cpp /home/phost/NetBeansProjects/MediaServer/main.cpp: In function ‘int main(int, char**)’: /home/phost/NetBeansProjects/MediaServer/main.cpp:36:15: warning: unused variable ‘db’ [-Wunused-variable] /home/phost/NetBeansProjects/MediaServer/main.cpp:38:44: warning: variable ‘control_socket’ set but not used [-Wunused-but-set-variable] /tmp/ccb5Ol8l.o: In function `database': /home/phost/NetBeansProjects/MediaServer/database.cpp:15: undefined reference to `mysql_init' /home/phost/NetBeansProjects/MediaServer/database.cpp:16: undefined reference to `mysql_real_connect' collect2: ld returned 1 exit status
Leider nach wie vor das gleiche..
Was genau bedeuten eigentlich die jeweiligen Parameter??
Bis auf den Teil$(mysql_config --libs --cflags) -Wall -o
versteh ich die Anweisung *g*
-
phost schrieb:
Zusätzlich habe ich mir hier das Archiv (Debian Linux) rausgezogen und den Inhalt daraus in mein /usr/ Verzeichnis entpackt.
GANZ schlechte Idee. Nie irgendwas unter /usr einfach so entpacken.
Software sollte immer aus den Repositories installiert werden. Gehe in die Softwareverwaltung und installiere den mysql-client. Und zwar die development Sachen. Also libmysql-client-devel oder so ähnlich.
-
Habe ich jetzt soweit getan..
Was ich jetzt also alles installiert habe an Paketen (habe dazu nach "mysql" im Software-Center gesucht):
- MySQL Client und Server
- libmysqlcppconn-dev
- libmysqlclient-dev
- libmysqlcppconn5
- mysql-client-5.5
- libmysqlclient18
- mysql-common
- mysql-client-core-5.5und noch einiges anderes wo ich aber schätze das das egal ist
-
Ok, dann versuch mal:
$ cd /home/phost/NetBeansProjects/ $ g++ -Wall -o mediaserver MediaServer/main.cpp MediaServer/database.cpp $(mysql_config --libs --cflags)
Das "-Wall" gibt einfach ein paar mehr Warnungen aus. Kannst dir ja mal
man gcc
anschauen. Das "-o file" gibt die Ausgabedatei an.Das Konstrukt "$(...)" führt das in den Klammern enthaltene Kommando aus und übergibt die Ausgabe davon als Parameter an (hier) g++.
-
Ahh okay.
Also jetzt klappt es. Schonmal vielen Dank!
Allerdings weiß ich jetzt nicht genau wieso, vermute aber das ich wohl den client tatsächlich noch nicht installiert hatte..Jetzt aber zum nächsten Problem:
Das war jetzt ja über die Konsole kompiliert, wie bekomme ich das alles jetzt in Netbeans entsprechend eingestellt?
Muss ich einfach nur$(mysql_config --libs --cflags)
mit in den Compiler-Aufruf reinpacken?
Und dann habe ich auch mal testweise versucht meine kompilierte Datei auszuführen, das tut's aber dann nicht ("unknown command")?/edit: wenn ich unter "Additional Commands" bei NetBeans beim C++ Compiler den Teil mit der mysql_config einfüge ändert sich scheinbar gar nicht der Compile-Aufruf durch NetBeans (zumindest wenn ich dem Log trauen darf)?
-
Keine Ahnung wie das genau in Netbeans funktioniert. Aber wahrscheinlich musst du die Ausgabe von mysql_config direkt bei Compile (--cflags) bzw Linker (--libs) einfügen.
Zum Ausführen musst du wahrscheinlich "./mediaserver" in dem passenden Verzeichnis ausführen. (Oder halt den absoluten Pfad nehmen.)
(Befehle werden nur in bestimmten Pfaden gesucht und direkt ausgeführt. Siehe $PATH)
-
Okay das passt jetzt alles.
Konnte die Datei auch korrekt ausführen und sie tut das was sie soll (was zwar noch nicht viel ist aber immerhin :D).
Wie ich das alles in NetBeans einstelle muss ich wohl selber austüfteln dann.
Wenn ich die jeweiligen Ausgaben (cflags/libs) von mysql_config einfach so in NetBeans entsprechend eintrage klappt es nicht..
Habe mir dazu mal den Aufruf angeschaut und ich muss wohl darauf achten das die zusätzlichen Parameter durch mysql_config ganz hinten im Aufruf stehen, bei NetBeans werden sie jedoch unmittelbar hinter g++ eingefügt und dann klappt es nicht.Um das noch zu verdeutlichen was ich meine..
g++ $(mysql_config --cflags --libs) -Wall -o mediaserver main.cpp database.cpp
funktioniert nicht.
g++ -Wall -o mediaserver main.cpp database.cpp $(mysql_config --libs --cflags)
das funktioniert.
Und alles was ich bei NetBeans für den Compiler oder Linker als zusätzliche Parameter eintrage wird direkt hinter dem g++ eingefügt.
/edit: okay wenn ich die Bibliotheken alle manuell auswähle dann gehts. Somit läuft jetzt alles wie es soll
Einen riesen Dank an euch!