MySql


Thomasio

Erfahrenes Mitglied
Ich habe schon 127 Mal Anlauf genommen, aber am Ende immer frustriert aufgegeben, weil ich es nicht auf die Reihe bringe.
Ich habe auch hier im Forum schon danach gefragt, auch Antwort bekommen, wochenlang herumprobiert, aber am Ende mehr Fehler als sonstwas produziert.

Hier also Anlauf Nr. 128:

Ich habe eine MySql Datenbank bei einem Provider gemietet.
Zugangsdaten habe ich, PHPMyAdmin ist beim Provider vorhanden und funktioniert, RemoteAccess ist enabled.
Jetzt will ich eine Anwendung schreiben, die auf meinem Heim-PC läuft und auf die DB zugreift.
Das Ganze muss nichts tolles können, nur ein paar simple queries wie SELECT, UPDATE, INSERT und DELETE.

Gelesen habe ich zum Thema derartig viel, dass ich vermutlich einiges durcheinander bringe, darum mal ganz langsam und ganz von vorne.

Von meinem Provider habe ich die Info, er hat http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-noinstall-5.1.56-win32.zip installiert.
Begriffen habe ich, dass ich bei mir die selbe Version von MySql installieren muss.
Begriffen habe ich auch, dass mein Compiler Code::Blocks/MinGW/GCC einiges an Vorbereitungen braucht, bevor ich die MySql Library überhaupt verwenden kann.

Das wars aber auch schon, danach ist Bahnhof.

Angefangen damit, dass auf meinem PC Win7 Ultimate 64 bit läuft.
Wenn in einer Anleitung steht, default ist c:\Program Files\ dann passt das schon nicht, denn unter Win7 in deutsch heisst das Verzeichnis c:\Programme.
Anscheinend funktioniert das trotzdem, vermutlich sind die beiden Namen virtuell verknüpft, oder wie man das nennen soll, aber es kommt ja noch schlimmer.
In der 64bit Version heisst das Verzeichnis c:\Programme(x86)\ und alles was 32bit ist, landet da drin, selbst wenn man bei Installation angibt, dass es in c:\Program Files\ soll.
Wenn ich dann z.B. in der Anleitung zu mysql++ lese, ich soll die Datei Makefile.mingw editieren und Verzeichnisnamen passend ändern, dann stehe ich schon völlig auf dem Schlauch, weil ich nicht mal weiss, wie die richtig heissen müssen.
Auf der Suche nach einer Alternative findet man dann Connector/C++, aber der ist für VisualC++ und unterstützt MinGW überhaupt nicht, allerdings gibt es den auch in 64bit, während mysql++ nur in 32bit existiert.
Im Web findet man dann 100 Seiten, die einem erklären wollen, wie man haufenweise .dll und .lib konvertieren soll, mit reimp und pexport und dlltool, aber alles was da bei mir raus kommt ist eine libmysql.a mit NULL byte, wobei ich nicht mal weiss, ob ich denn nun libmysql.lib oder mysqlclient.lib, oder beides brauche.

Hier im Forum habe ich dann noch einen Kommentar gefunden, dass man diese Wrapper gar nicht braucht, sondern auch die "simple C Schnittstelle" nehmen kann, aber wie das funktionieren soll, dazu habe ich im gesamten Web nichts gefunden.

Um Probleme mit Win7 und 64bit zu umgehen habe ich mir mit VirtualBox ein virtuelles XP in 32bit installiert, aber auch damit haben meine .a nur NULL byte.
Dazu kommen dann andere Fehlermeldungen, wie "Invalid or corrupt import library" und 1000 Weitere.

In kurz:
Hat jemand Erbarmen mit mir und erklärt mir "für Doofe" wie man, angefangen bei frisch installiertem WindowsXP plus Code_Blocks/MinGW, zu "#include <mysql.h>" kommt?
 

deepthroat

Erfahrenes Mitglied
Hi.

Zeige einfach was du gemacht hast und die Ausgabe davon.

Warum packst du denn irgendwelche Dateien manuell in %programfiles%? Entpacke die Quellen in einem beliebigen Verzeichnis wo du auch genau weißt wie es heißt.

Bist du denn in der Lage ein einfaches MySQL C Programm zu erstellen? Das solltest du mal zuerst machen bevor du versuchst mysql++ zu kompilieren.

Gruß
 

Thomasio

Erfahrenes Mitglied
Nein, ich bin nicht in der Lage ein "einfaches MySQL C Programm" zu erstellen, weil ich schon bevor ich überhaupt mit der ersten Zeile Code anfangen könnte stolpere über:

1) MySql braucht mysql.h
2) mysql.h braucht diverse .dll und .lib
3) MinGW kann diese nicht direkt verwenden, sondern braucht .a
4) Meine Versuche irgendwas in .a umzuwandeln (ich weiss nicht mal genau was ich da brauche) enden mit Dateigrösse 0.

Genau das hatte ich gemeint mit:

... dass man diese Wrapper gar nicht braucht, sondern auch die "simple C Schnittstelle" nehmen kann, aber wie das funktionieren soll, dazu habe ich im gesamten Web nichts gefunden.
 

Thomasio

Erfahrenes Mitglied
Ja, das ist ein gutes Beispiel, ich habe versucht Wort für Wort den Beitrag da unten auf der Seite zu befolgen.
Das reicht genau bis zur Zeile

pexports libmySQL.dll | sed 's/^_//' > libmySQL.def

Wenn ich das in meine Eingabeaufforderung eingebe, bekomme ich "Der Befehl sed ist entweder falsch geschrieben oder existiert nicht".
Suche ich dann bei Google nach +"pexports" +"libmySQL.dll" +"libmySQL.def", dann finden sich ein paar Seiten, wo der Befehl kürzer geschrieben wird, einfach nur

pexports libmySQL.dll > libmySQL.def

aber wenn ich das mache, und danach (wieder zurück zur ersten Seite) in meine Eingabeaufforderung eingebe

dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libMySQLclient.a -k

dann bekomme ich eine libMySQLclient.a mit NULL byte.

Spätestens an dieser Stelle ist Essig mit Methode und Struktur, da sitze ich davor, wie die Kuh vorm Bahnhof.

Spasseshalber habe ich dann trotzdem noch eine Zeile weiter unten geschaut, und da steht dann

g++ revolution.cpp -lws2_32 -lmysqlclient -o revolution.exe

aber ich rufe g++ nicht an der Eingabeaufforderung auf, ich habe Code::Blocks, ich klicke "Build", sprich ich muss (wenn ich denn die Schritte vorher irgendwann schaffe) die ganzen Optionen unter "Project - Build options" eingeben, aber da bin ich mir nicht sicher, wie das aussehen muss, vermutlich unter "Other Linker options", aber Syntax?
 

deepthroat

Erfahrenes Mitglied
Ja, das ist ein gutes Beispiel, ich habe versucht Wort für Wort den Beitrag da unten auf der Seite zu befolgen.
Das reicht genau bis zur Zeile

pexports libmySQL.dll | sed 's/^_//' > libmySQL.def

Wenn ich das in meine Eingabeaufforderung eingebe, bekomme ich "Der Befehl sed ist entweder falsch geschrieben oder existiert nicht".
Evtl. solltest du dann sed erstmal installieren und sicherstellen, dass das Verzeichnis im Pfad ist... :eek:

http://gnuwin32.sourceforge.net/packages/sed.htm
Suche ich dann bei Google nach +"pexports" +"libmySQL.dll" +"libmySQL.def", dann finden sich ein paar Seiten, wo der Befehl kürzer geschrieben wird, einfach nur

pexports libmySQL.dll > libmySQL.def

aber wenn ich das mache
Wie sieht die libmySQL.def Datei aus? Gab es Fehlermeldungen?

Warum schreibst du soviel? Zeig doch einfach die Befehle auf der Kommandozeile - das geht schneller für dich und auch für mich da ich mir nicht den ganzen Text durchlesen muss.

Gruß
 

Thomasio

Erfahrenes Mitglied
Zuerst mal ganz vielen Dank, dass du dir die Mühe machst mir zu helfen.

Ich wäre nie darauf gekommen, dass sed ein eigenes Programm ist, jetzt habe ich es installiert und wenigstens ist die Fehlermeldung eine Andere.
Ich weiss nicht genau wie ich "Zeig doch einfach die Befehle auf der Kommandozeile" machen soll, ich schreibe dir doch genau das hier rein, was ich da eintippe und was er antwortet (diesmal mache ich dir noch einen Screenshot dazu).

Was ich gemacht habe ist:

1) Path gesetzt, hier die komplette Zeile

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\MinGW\bin;C:\MinGW\libexec\gcc\mingw32\4.4.1;C:\MySQL\bin;C:\MySQL\lib\opt;C:\MinGW\sed\bin

2) libmySQL.dll kopiert nach D:\

3) Eingabeaufforderung den ganzen Befehl eingetippt ... siehe screenshot.
Das ergibt eine libmySQL.def mit 0 byte.

4) Den Befehl ohne "sed... " eingetippt, keine Fehlermeldung, ergibt eine libmySQL.def mit 2,76kb.

5) dlltool ... siehe screenshot, keinerlei Meldung.
Diesmal hat die libMYSQLclient.a 110kb (wenigstens mal nicht 0), aber ob das jetzt richtig ist? Ohne sed?
 

Anhänge

  • prompt.JPG
    prompt.JPG
    31,6 KB · Aufrufe: 26

deepthroat

Erfahrenes Mitglied
Ich weiss nicht genau wie ich "Zeig doch einfach die Befehle auf der Kommandozeile" machen soll, ich schreibe dir doch genau das hier rein, was ich da eintippe und was er antwortet (diesmal mache ich dir noch einen Screenshot dazu).
Du bist aber auch ein schwerer Fall..

Warum - um Himmels Willlen - kopierst du denn nicht einfach alles was in der Konsole steht und fügst es hier ein? :confused: ? :confused: ?

3) Eingabeaufforderung den ganzen Befehl eingetippt ... siehe screenshot.
Das ergibt eine libmySQL.def mit 0 byte.
Das ist klar. sed hat keine Ausgabe produziert, da du ungültige Argumente übergeben hast.

Verwende statt der einfachen Anführungszeichen bei sed doppelte Anführungszeichen (Joshua McQuistan hat offenbar nicht cmd.exe benutzt sondern eine Bash) oder lass die Anführungszeichen ganz weg:
Code:
pexports.exe libmySQL.dll | sed.exe -e s/^_// > libmysql.def
4) Den Befehl ohne "sed... " eingetippt, keine Fehlermeldung, ergibt eine libmySQL.def mit 2,76kb.

5) dlltool ... siehe screenshot, keinerlei Meldung.
Diesmal hat die libMYSQLclient.a 110kb (wenigstens mal nicht 0), aber ob das jetzt richtig ist? Ohne sed?
Das kommt drauf an, ob die Symbole in der .def Datei einen führenden Unterstrich haben. Der Sinn des sed Aufrufes ist es den Unterstrich zu entfernen.

Gruß
 

Thomasio

Erfahrenes Mitglied
:-( Ich weiss, dass ich mich öfter mal zu blöd anstelle.

Copy&Paste? Aus der Konsole? Vom virtuellenXP in VirtualBox zu IE8 unter Win7? Wie geht das?

Egal, ich habe jetzt endlich inkl sed (dank deiner Hilfe) eine libMYSQLclient.a mit 109kb.
Das ist doch schon mal was.

Wie gehts weiter?
libMYSQLclient.a kopieren nach C:\MinGW\lib?

Code::Blocks - Create a new project
Build options - Linker settings
Was eingeben? Unter "Link libraries" und/oder "Other linker options"?

Im Code, ganz oben, was includen?
Nur mysql.h?
Muss ich die vorher von C:\MySQL\include nach C:\MinGW\include kopieren?
 

ComFreek

Mod | @comfreek
Moderator
Ich habe mir jetzt nicht alles durchgelesen, aber du musst die Library per Project->Build options->Linker settings->Add einbinden, entweder für einzelne Build targets oder für das ganze Projekt.
 

Thomasio

Erfahrenes Mitglied
Ok, für die libMYSQLclient.a war mir das ziemlich klar, aber was ist mit mysql.h?
Wenn ich einfach mache
#include <mysql.h>
dann kommt mir der Compiler mit "no such file ..."
kopiere ich mysql.h nach C:\MinGW\include kommt der Compiler mit einem halben Dutzend anderen Meldungen, ala
mysql_com.h no such file ...
Die Frage ist also, muss ich irgendein Search directory einstellen, oder alles was ihm fehlt nach MinGW kopieren, oder was?

Und weil ich gerade am rumprobieren bin, habe ich dann noch folgendes Problem:

Ich habe einfach mal alles was ihm gefehlt hat nach MinGW/include kopiert und das Besipiel von
http://www.osix.net/modules/article/?id=517
verwendet.

Wie Joshua McQuistan in seiner Anleitung schon gesagt hat bekomme ich die Meldung
undefined reference to ´mysql_init@4'
Nachdem aber dank sed im .def alle Unterstriche entfernt sind, gibt es dort kein mysql_init, an das ich @4 anhängen könnte und wenn ich
mysqlinit@4
mache, bleibt die Fehlermeldung
undefined reference to ´mysql_init@4'
 
:offtopic:
Copy&Paste? Aus der Konsole? Vom virtuellenXP in VirtualBox zu IE8 unter Win7? Wie geht das?
Gasterweiterungen im virtuellen XP installieren, in den VirtualBox-Einstellungen für die VM das Clipboard Sharing aktivieren. Dann in XP Rechtsklick auf die Konsole, „markieren“ klicken, mit Drag&Drop Bereich auswählen und mit rechter Maustaste abschließen. Im Browser auf dem Gastsystem Strg+V drücken.

Grüße,
Matthias
 

Thomasio

Erfahrenes Mitglied
Hui, danke, DAS wusste ich echt nicht.
Ganz am Rande was gelernt.

Wenn ich jetzt nur noch MySql die Fehlermeldungen abgewöhnen könnte ....
 

Thomasio

Erfahrenes Mitglied
Zusatz, weil es mir gerade aufgefallen ist:

Wenn ich das zip archiv runterlade: http://dev.mysql.com/downloads/mirror.php?id=401746 und entpacke, dann gibt es da drin 2 mal eine libmysql.dll einmal unter \bin\ und einmal unter \lib\opt, aber beide schreiben sich ganz in Kleinbuchstaben, eine libmySQL.dll existiert im gesamten Archiv nicht.
Lade ich den installer runter: http://dev.mysql.com/downloads/mirror.php?id=401700 und installiere das Ganze, dann findet sich da drin eine libmySQL.dll.

Ich habe keine Ahnung, ob das wichtig ist, aber es macht scheinbar Unterschiede, denn auch wenn beide keinerlei Fehlermeldungen in der Konsole ausgeben, NUR die libmySQL.dll mit SQL in gross funktioniert mit pexports und dlltool, die anderen ergeben eine libMYSQLclient.a mit 0 byte Grösse.

In jedem Fall habe ich aber immer das Problem mit
undefined reference to ´mysql_init@4'
 

deepthroat

Erfahrenes Mitglied
Hi.

Mir ist gerade eingefallen, das das alles auch noch etwas einfacher geht.

Der MinGW Linker ist in der Lage direkt gegen DLLs zu linken.

Also:
C:
#include <stdio.h>
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
  printf("MySQL client version: %s\n", mysql_get_client_info());
}
Einstellungen:

Search directories -> Compiler:
%programfiles%\mysql\mysql server 5.1\include

Linker Settings -> Link libraries:
%programfiles%\mysql\mysql server 5.1\bin\libmysql.dll

\edit: Um die Linker-Warnungen zu unterdrücken:
Linker Settings -> Other linker options:
-Wl,--enable-stdcall-fixup

Ausgabe:
Code:
MySQL client version: 5.1.30
Gruß
 
Zuletzt bearbeitet:

Thomasio

Erfahrenes Mitglied
Bei mir sagt der Compiler:

||=== MySQLTest, Release ===|
C:\MySQL\include\config-win.h|208|warning: "finite" redefined|
C:\MySQL\include\config-win.h|161|warning: this is the location of the previous definition|
C:\MySQL\include\my_global.h|616|warning: "my_reinterpret_cast" redefined|
C:\MySQL\include\config-win.h|312|warning: this is the location of the previous definition|
C:\MySQL\include\my_dbug.h|145|error: crtdbg.h: No such file or directory|
C:\MySQL\include\my_global.h||In function 'double rint(double)':|
C:\MySQL\include\my_global.h|1567|error: redefinition of 'double rint(double)'|
c:\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\math.h|698|error: 'double rint(double)' previously defined here|
||=== Build finished: 3 errors, 4 warnings ===|
 

Thomasio

Erfahrenes Mitglied
Ausgabe

||=== MySQLTest, Release ===|
C:\MySQL\include\config-win.h|208|warning: "finite" redefined|
C:\MySQL\include\config-win.h|161|warning: this is the location of the previous definition|
C:\MySQL\include\my_global.h|616|warning: "my_reinterpret_cast" redefined|
C:\MySQL\include\config-win.h|312|warning: this is the location of the previous definition|
obj\Release\main.o:main.cpp|| undefined reference to `mysql_get_client_info@0'|
||=== Build finished: 1 errors, 4 warnings ===|
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Welche Compiler Version? Linker Version?
Code:
gcc --version
gcc (GCC) 4.5.0
ld --version
GNU ld (GNU Binutils) 2.20.51.20100613
Besorg dir die neueste Version.

Gruß
 

Thomasio

Erfahrenes Mitglied
Hui, musste ein bischen suchen, weil mingw.org grad offline ist, aber habs gefunden, 4.5.2.
Compiliert ohne Fehler, Ausgabe:
MySQL client version: 5.1.56

Nur einen kleinen Schönheitsfehler hat es noch.
Beim ausführen der .exe meckert er, dass

libgcc_s_dw2-1.dll
libmysql.dll

fehlen, sprich ich muss die dazu kopieren.
Ich weiss, das ist durchaus üblich so, aber ich habe mal irgendwo was gelesen, dass man da auch in den Linker options irgendwas mit auto import machen kann, so dass er die gleich mit in die .exe packt.
Kannst du mir dafür noch die Syntax verraten?

Auf jeden Fall ein riesen DANKE an dich, du hast mir in 2 Tagen mehr geholfen als der gesamte Rest vom Web in Monaten.
 

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.622
Mitglieder
187.833
Neuestes Mitglied
SirrDansen