2012-04-13 12 views
4

Ich versuche, den MySQL C++ Connector zu verwenden, um eine Verbindung zu einer Datenbank herzustellen. Ich habe die Bibliotheken hinzugefügt und der Quellcode kompiliert korrekt mit allen notwendigen # include-Anweisungen. Der Code, den ich verwende, ist der folgende:MySQL Connector C++ - ungültiger Zeiger

#include <stdlib.h> 
#include <iostream> 

#include "mysql_connection.h" 

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

using namespace std; 

int main(void) 
{ 
    using namespace sql; 

    Driver *driver; 
    Connection *con; 

driver = get_driver_instance(); 
con = driver -> connect("tcp://127.0.0.1:3306/test", "test", "test"); 
} 

Der Code ist direkt aus den Beispielen genommen und sollte ordnungsgemäß funktionieren. Ich habe den Code deutlich verkürzt, wie es in der letzten "Treiber -> Verbindung" Zeile ist, wo der Fehler geworfen wird. Meine Fehlermeldung ist folgende:

*** glibc detected *** /home/username/NetBeansProjects/mysql/dist/Release/GNU-Linux-x86/mysql: 
free(): invalid pointer: 0x091dd468 *** 

ich auf Linux Mint bin Lisa, die neueste Version von MySQL läuft und mit NetBeans 7.1 als IDE. Wie erwähnt, kompiliert der Code korrekt, und es ist in dieser letzten Verbindungslinie, wo der Fehler auftritt. Jede Hilfe oder Empfehlungen für einen anderen Verbindungsmechanismus würden sehr geschätzt werden.


UPDATE

Hier ist der Code von der Treiberklasse, wo die Verbindung definiert ist

class CPPCONN_PUBLIC_FUNC Driver 
{ 
protected: 
virtual ~Driver() {} 
public: 
// Attempts to make a database connection to the given URL. 

virtual Connection * connect(const sql::SQLString& hostName, const sql::SQLString& userName, const sql::SQLString& password) = 0; 

virtual Connection * connect(ConnectOptionsMap & options) = 0; 

... 

nichts zu sehen ... in meiner bescheidenen Meinung nach ...

+0

Es sieht aus, als ob ein Speicher free'd wurde und versucht dann wieder free'd werden, aber nicht, weil es nicht mehr zugeordnet. Kannst du wirklich nicht von dem Code, den du gepostet hast, den Rest posten oder einen Link zum Beispielcode setzen? – TomP89

+0

Das ist der ganze Code! Ich poste den Code von der Seite mit dem Treiber -> connect-Funktion, aber das kommt direkt vom MySQL Connector-Entwicklungsteam, also bezweifle ich, dass es einen Fehler enthalten würde:/ –

+0

Ist "get_driver_instance" Ihr Code oder ist es Teil von Connector? Wenn es Ihr ist, schreiben Sie _that_. – ildjarn

Antwort

3

Ich habe die Lösung dieses Problems für Ubuntu 12.04 gefunden, es hat mich ungefähr 48 Stunden Schlaf gekostet, aber ok, hier geht es. Ich bin sicher, dass dieser Fix für andere Ubuntu-Versionen funktioniert. Laden Sie die libstdC++ .so.5 von http://www.sopcast.com/download/libstdcpp5.tgz herunter. Sie müssen die Dateien extrahieren und in/usr/lib ablegen.

Stellen Sie sicher, fügen -llibstdC++. So.5 wenn Ihre Anwendung mit g ++ Aufbau (diese Links STDC++ v5)

Dann Google-Connector C++ Ubuntu 12.04 "und sucht die Builds und die .deb-Download für Ihre Bogen.

Für Ubuntu 12.04 hier ist die URL für die .debs https://launchpad.net/ubuntu/precise/+source/mysql-connector-c++/+builds Wählen Sie Ihren Bogen ie. Amd64 und laden Sie die beiden .debs unter den Built Files herunter. Öffnen und installieren Sie den Paketmanager. Sie sollten Ihre App jetzt ohne Probleme und Probleme ausführen können.

EDIT Sie brauchen nicht zu verknüpfen libstdC++. So.5, könnten Sie auf Ihrem System haben, aber auf Ubuntu 12.04 amd64 seine nicht benötigt.

1

Lassen Sie Ihre C++ - Programme in weniger als 2 Minuten mit MySQL kommunizieren!

HINWEIS: Dies funktioniert auf Ubuntu 12.04 Servern (AWS EC2) mit MySQL (typisches LAMP Setup), keine Rückwärtskompatibilität garantiert.

Für den Zugriff auf MySQL-Datenbanken aus einem C++ Programm, müssen Sie zunächst einige mysql Bibliotheksdateien mit der folgenden Befehlszeile

sudo apt-get install libmysqlclient-dev 

eine Konfigurationsdatei speichern als „mysql_config“ im gleichen Verzeichnis installieren, wo Sie sparen (und führen Sie Ihre App - sagen wir "/ temp")

mysql_config --cflags 
-I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -DUNIV_LINUX 
mysql_config --libs 
-Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient 

kompilieren Sie Ihre C++ Datei "myapp.cav“, mit

sudo g++ -o myapp $(mysql_config --cflags) myapp.cpp $(mysql_config --libs) 

basierend auf this excellent functional example von Coding Friends geschrieben

+2

Sie haben diese selbe Antwort viermal gepostet, wir betrachten das als etwas spammig. Bitte tu das nicht. Wenn Sie dies tun, bedeutet das normalerweise, dass die Fragen Duplikate sind, also kennzeichnen Sie sie als solche. Wenn sie keine genauen Duplikate sind, dann hinterlasse einfach einen Kommentar unter der Frage, die auf diese Antwort zeigt. Vielen Dank. – Kev

+1

ich entschuldige @Kev, die Antwort war für 4 Fragen geeignet. was soll ich machen? lassen Sie diese Fragen ohne eine richtige Antwort? Sie sind keine genauen Duplikate, sie sind gültige Fragen und meine Antwort gilt für alle. Ich könnte antworten auf eine Antwort auf eine andere Frage, aber niemand liest das. UND, die vorherigen Antworten auf diese Fragen waren ehrlich gesagt lahm, IMHO. ABER, da du die Regeln machst, werde ich das nicht noch einmal tun, damit ich nicht wieder "spammy" genannt werde, wenn ich versuche, anderen zu helfen. PS: Ich versuche die Antworten zu ändern, um nicht "spammy" zu sein, aber finde sie nicht, sorry. –

Verwandte Themen