Visual Studio 2017 - C++ und MySQL



  • Hallo an alle,
    ich bin neu hier auf der Seite neu und bis auf ein paar Grundkenntnisse auch Anfänger in C++. Bei mir scheitert es aber schon am Installieren des Visual Studios 2017. Ich habe es ganz normal installiert. Hab mir dann "mysql-for-visualstudio-1.2.8" runtergeladen und auch das installiert.

    Wenn ich jetzt im Code folgendes inkludiere:
    #include <mysql_connection.h>

    #include <cppconn/driver.h>
    #include <cppconn/exception.h>
    #include <cppconn/resultset.h>
    #include <cppconn/statement.h>

    Bekomme ich folgende Fehlermeldung (1x für jede Zeile):
    Die Datei "Quelle" kann nicht geöffnet werden: "mysql_connection.h".

    Kann mir von euch jemand weiterhelfen? Wie bzw. was muss ich installieren damit es funktioniert?

    Mfg
    Alex



  • @neo2003i
    Zunächst sollte das Verzeichnis, in dem sich mysql_connection.h befindet, zu den Include-Verzeichnissen deines Projekts hinzugefügt werden, damit der Compiler diesen Header finden kann. In der Kommandozeile geht das bei allen gängigen Compilern mit dem Kommandozeilen-Parameter -I<Pfad des Include-Verzeichnisses>. In Visual Studio lassen sich unter Project->Properties->C/C++->General->Additional Include Directories Solche Include-Verzeichnisse eintragen, die Visual Studio dann beim Kompilieren als solche -I bzw /I-Parameter an den Compiler übergibt (siehe auch in den Properties unter Command Line, wenn du das Verzeichnis eingetragen hast. Das erscheint dann dort als ein solcher /I-Parameter).

    Ich vermute mal, dass cppconn ein Unterverzeichnis unterhalb der mysql_connection.h ist. In diesem Fall muss dieses Verzeichnis nicht extra in den Additional Include Directories eingetragen werden, da mit #include-Direktiven auch Pfade relativ zu Include-Verzeichnisen gefunden werden.

    Das nächste Problem, auf das du vermutlich stoßen wirst, ist, dass der Linker Funktionen aus der MySQL-Bibliothek nicht finden kann (Fehlermeldungen mit "unresolved external" o.ä.). Analog zu den Include-Verzeichnissen musst du nämlich auch dem Linker mitteilen, wo sich die einzubindenden Bibliotheken befinden und welche davon "gelinkt" werden sollen (.lib-Dateien für den Visual Studio-Compiler und .a-Dateien für die meisten anderen Compiler).

    Die Bibliotheks-Verzeichnisse werden mit dem -L-Parameter an den Linker übergeben. In Visual Studio findest du diese Einstellung unter Project->Properties->Linker->General->Additional Library Directories. Dort gibst du das Verzeichnis an, in dem sich die .lib-Dateien der MySQL-Bibliothek befinden. Zusätzlich musst du auch noch unter Project->Properties->Linker->Input->Additional Dependecies die Dateinamen der Bibliotheken angeben, die eingebunden werden sollen. Falls die Bibliothek mehrere solcher .lib-Dateien beinhaltet, solltest du deren Dokumentation konsultieren, welche davon für welche Funktionen eingebunden werden müssen.

    Das sollte eigentlich reichen, um mit der Bibliothek arbeiten zu können. Bei C-Bibliotheken reicht das ziemlich sicher, allerdings legen die Dateinamen nahe, dass es sich hierbei um eine C++-Bibiothek handelt. Bei letzteren ist es fast immer notwendig, dass die Bibliotheken mit exakt der selben Compiler-Version und Compiler-Flags gebaut wurden, wie du sie für dein Programm verwendest. Zumindest solltest du sicherstellen, dass die .lib-Dateien die du einbindest, der Konfiguration enstprechen mit der du arbeitest (Debug/Release, x64/Win32), bevorzugt sollte "mysql-for-visualstudio-1.2.8" ebenfalls mit VS2017 gebaut worden sein.

    Du kannst unter den Projekteigenschaften auch für jede Konfiguration (Debug/Release, x64/Win32) separate .lib-Dateien angeben, was du auch machen solltest - so eine C++-.lib wird immer nur mit einer bestimmten Konfiguration korrekt funktionieren (was nicht immer zu einer Fehlermeldung beim Kompilieren/Linken führt, sondern nicht selten auch zu mysteriösen Fehlern zur Laufzeit).

    Gruss,
    Finnegan

    P.S.: Ich denke dieses Thema wäre wahrscheinlich besser im Compiler und IDE-Forum aufgehoben.



  • Danke für die ausführliche Beschreibung. Ich bin diese Schritt für Schritt durchgegangen. Ich habe unter C/C++ das include verzeichnis hinzugefügt. Unter Linker/Allgemein hab ich den lib ordner hinzugefügt. Und unter Linker/Input habe ich "mysqlcppconn.lib" und mysqlcppconn-static.lib" hinzugefügt.

    Aktuell erkennt der Compiler den include <mysql_connection.h>. Eine Fehlermeldung bekomme ich jetzt noch in dem File mysql_connection.h. Dort sind folgende includes drinnen:

    #include <cppconn/connection.h>
    #include <boost/shared_ptr.hpp>
    #include <boost/scoped_ptr.hpp>

    ich bekomme jetzt noch die Meldungen, dass boost/shared_ptr.hpp und boost/scoped_ptr.hpp nicht geöffnet werden können.
    Hab ich was vergessen oder falsch gemacht?



  • Hast du denn schon boost installiert? Wundert mich aber, daß auf Download MySQL for Visual Studio nichts davon steht...



  • @neo2003i sagte in Visual Studio 2017 - C++ und MySQL:

    Danke für die ausführliche Beschreibung. Ich bin diese Schritt für Schritt durchgegangen. Ich habe unter C/C++ das include verzeichnis hinzugefügt. Unter Linker/Allgemein hab ich den lib ordner hinzugefügt. Und unter Linker/Input habe ich "mysqlcppconn.lib" und mysqlcppconn-static.lib" hinzugefügt.

    Ohne die Bibliothek genau zu kennen vermute ich, dass es sich bei den beiden .lib-Dateien wahrscheinlich um die selbe Bibliothek handelt. Wahrscheinlich dient die mysqlcppconn.lib um gegen die entsprechende DLL-Datei der Bibliothek zu linken und die mysqlcppconn-static.lib um die Bibliothek statisch zu linken. Du solltest daher wahrscheinlich nur eine von beiden einbinden. Genaueres steht (hoffentlich) in der Dokumentation.

    @Th69 sagte in Visual Studio 2017 - C++ und MySQL:

    Hast du denn schon boost installiert? Wundert mich aber, daß auf Download MySQL for Visual Studio nichts davon steht...

    Ja, die Header-Dateien unterhalb von boost/ gehören zu Boost, das wahrscheinlich eine Abhängigkeit der MySQL-Bibliothek ist. Ich habe gerade auch nochmal die Dokumentation der MySQL-Bibliothek überflogen und mich gewundert, dass dort nichts von solchen Abhängigkeiten erwähnt wird. Sollte der Installer das vielleicht alles automagisch konfigurieren oder erwarten die tatsächlich, dass jeder so etwas selbst erkennen kann? Ich halte mich für keinen Neuling und würde dafür selbst auch eine ganze Weile brauchen, das unter solchen Bedingungen ans laufen zu bekommen 🙂

    @neo2003i
    Du kannst das Installationsverzeichnis der MySQL-Bibliothek mal durchsuchen, und schauen, ob dieses vielleicht die benötigten Boost-Header irgendwo beinhaltet. Falls ja, dann solltest du auch das Verzeichnis, welches boost/ als Unterverzeichnis enthält, zu den Include-Verzeichnissen hinzufügen. Falls nicht, musst du wohl auch noch Boost herunterladen.

    Die meisten Bibliotheken in Boost sind sog. Header-only-Libraries, weshalb es wahrscheinlich ausreicht, lediglich das include-Verzeichnis von Boost zum Projekt hinzuzufügen.

    Es ist aber durchaus möglich, dass die MySQL-Bibliothek noch weitere Abhängigkeiten hat. Schau dir am besten nochmal genau das Wiki und auch die Foren zu dieser Bibliothek an. Vielleicht hat jemand schonmal eine genaue Anleitung geschrieben, wie man diese Bibliothek einbindet. Ich kenne die MySQL-Bibliothek und deren Besonderheiten selbst nämlich nicht (!) und helfe hier nur mit meiner allgemeinen Erfahrung beim Einbinden von Bibliotheken.

    Gruss,
    Finnegan



  • @Finnegan sagte in Visual Studio 2017 - C++ und MySQL:

    Es ist aber durchaus möglich, dass die MySQL-Bibliothek noch weitere Abhängigkeiten hat.

    Zumindest unter Linux scheint das nicht der Fall zu sein:

    $ apt-cache depends libmysqlcppconn-dev
    libmysqlcppconn-dev
      Hängt ab von: libboost-dev
      Hängt ab von: libmysqlcppconn7v5
    

    (und letzteres hängt nicht von *-dev-Paketen ab)

    Wäre natürlich trotzdem gut, wenn das irgendwo dokumentiert wäre. Ist es vermutlich auch 🙂 Jedenfalls sollte boost erstmal reichen. Ich habe selbst die mysqlcppconn ein paar mal benutzt (bevor ich zu pqxx gewechselt habe) und mir ist nie irgendwas Spezielles zur Installation aufgefallen.



  • Hallo,

    danke an alle für die Antworten.
    Leider bin ich immer noch nicht auf einen grünen Zweig gekommen. ich kann zwar mittlerweile den Code kompilieren und beim Start öffnet sich auch die Konsole. Zeitgleich öffnet sich aber auch ein PopUp mit der Meldung, dass das Programm nicht gestartet werden kann da mysqlcppconn-7-vs14.dll auf dem Computer fehlt.
    Die dll ist aber vorhanden.
    Ich weiß echt nicht mehr weiter. Stell ich mich wirklich so doof an oder ist C++ tatsächlich so kompliziert. Bin langsam am überlegen ob ich das ganze nicht mit c# versuchen soll.



  • @neo2003i

    Die dll ist aber vorhanden.

    Dann aber nicht dort, wo sie gesucht wird. Kopiere sie in den Ordner, in dem das Programm liegt.





  • Hallo an alle,

    @manni66: das wars...Danke dir. Ich habe die lib zwar im Linker angegeben, aber die dll nicht in das Programmverzeichnis kopiert. Hab ich entweder bei den ganzen Beschreibungen im Netz übersehen, oder es wurde nirgends erwähnt.

    Danke an alle für eure Antworten.


Anmelden zum Antworten