[Erledigt] Mit C++ auf lokale Datenbank zugreifen



  • Guten Tag,
    ich möchte mit einem C++ Programm auf eine lokale Datenbank zugreifen (habe den MySQL Server installiert).
    So viel zu meinem Problem 😃
    Mein System ist Ubunut 12.04.
    Was meine bisherigen Google-Recherchen ergeben haben ist, das ich wohl die Header-Dateien brauche und Libraries (das habe ich glaube ich alles schon). Allerdings bekomme ich die Librariers ums verrecken nicht verschoben (versuche das übers Terminal, weil sudo und so).
    Und was meinen Code angeht, da habe ich bisher folgendes:

    #include "database.h"
    #include <mysql/mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    database::database(const char* _server, const char* _user, const char* _password, const char* _database, const char* _prefix) {
        MYSQL *connect, mysql;    
        mysql_init(&mysql);
        connect = mysql_real_connect(&mysql, _server, _user, _password, _database, 0, NULL, 0);
        if(connect){
            printf("Connected to Database");
        }
    }
    
    database::database(const database& orig) {
    }
    
    database::~database() {
    }
    

    wobei database.h logischerweise die header-Datei von der klasse darstellt..

    MfG



  • Wenn du eine Frage stellen würdest, könnte sie vielleicht beantwortet werden.



  • Kurz: was muss ich tun damit das funktioniert und wie muss ich es tun?
    Also wie bekomme ich die Bibliotheken installiert die ich brauche und wie binde ich das alles korrekt in mein Projekt ein?



  • 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)


Anmelden zum Antworten