[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-dev

    Zusä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 Aufruf

    g++ -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? [...]

    RTFFFFFFFFFFM!!



  • 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.5

    und 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! 👍


Anmelden zum Antworten