# mySQL und C unter Windows anbinden



## AndreWHV (13. Januar 2004)

Hallo!

Ich bin gerade dabei ein kleines C Programm zu schreiben, um die Anbindung an eine mySQL Datenbank zu lernen. Mit Hilfe von Tutorials und einigen Foren bin ich bis zu folgendem Problem gekommen. 

[Linker Fehler] Unresolved external 'mysql_init' referenced from database.c

Die Meldung erscheint beim Komplieren.

Herausgefunden habe ich, dass ich die Datei libmySQL.lib irgendwie linken muss, damit die DLL libmySQL.dll angesprochen werden kann. 
Ich weiß leider nur nicht genau wie das gehen soll.

Als Entwicklungsumgebung verwende ich Dev-C++ (4.9.8.0)mit Mingw/GCC 3.2. Die Pfade zu den Include und Bibliotheksdateien habe ich angegeben.

Ich hoffe das mir jemand bei diesem Problem weiterhelfen kann.

BS: Win2000
DB: mySQL 4.01

Vielen Dank im voraus...

P.S. Die Anbindung soll nicht über ODBC erfolgen und mir hilft mySQL++ auch nicht weiter, da ich kein UNIX bzw. Borland C++ habe.


----------



## chibisuke (13. Januar 2004)

mySQL++ arbeitet nach ISO-C++ wenns recht is... ;-)
das heißt es geht auch mit Dev-C++

aber gut.. kopier die libMySQL.lib in das bibliotheksverzeichnis, und die DLL in dein programmverzeichnis, das sollte dein problem lösen...


----------



## AndreWHV (14. Januar 2004)

Mag sein, dass man mySQL++ auch mit DEV-C++ kompilieren kann, aber dazu gibts schon mehrere Topics, die sich mit dem Problem beschäftigen.

Aber das ist ja auch nicht mein Ziel. Deinen Lösungsvorschlag habe ich gleich ausprobiert und bin leider nicht an das gewünschte Ziel gekommen. 

Inzwischen habe ich herausgefunden, dass man die lib-Bibliotheken über die Projektoptionen einbinden kann. So hat sich mein ursprünglich gedachtes Problem gelöst. Hilft mir allerdings auch nicht viel weiter, da immer noch  Fehlermeldungen kommen.

Ich habe auch versucht über die Konsole mit dem gcc-Compiler zu arbeiten. Leider kommt da dieselbe Fehlermeldung.
Folgende Parameter habe ich verwendet:

gcc -c -g -Wall -I"C:/mysql/include" -o main.o main.c
lief ohne Fehlermeldung und erzeugte die Datei main.o

gcc -o mysqltest main.o -L"C:/mysql/lib" -lm -llibmysql
hat folgende Fehlermeldung gebracht

main.o(.text+0x8b): In function `main':
C:/uebung/main.c:15: undefined reference to `mysql_init@4'
main.o(.text+0xad):C:/uebung/main.c:18: undefined reference to `mysql_real_connect@32'
main.o(.text+0xd5):C:/uebung/main.c:22: undefined reference to `mysql_close@4'
main.o(.text+0x10b):C:/uebung/main.c:28: undefined reference to mysql_query@8'
main.o(.text+0x11d):C:/uebung/main.c:30: undefined reference to `mysql_error@4'
main.o(.text+0x149):C:/uebung/main.c:31: undefined reference to mysql_close@4'
main.o(.text+0x161):C:/uebung/main.c:35: undefined reference to mysql_store_result@4'
main.o(.text+0x172):C:/uebung/main.c:37: undefined reference to ysql_num_field
s@4'
main.o(.text+0x186):C:/uebung/main.c:38: undefined reference to mysql_fetch_row
@4'
main.o(.text+0x201):C:/uebung/main.c:44: undefined reference to mysql_free_resu
lt@4'
main.o(.text+0x20f):C:/uebung/main.c:46: undefined reference to `mysql_close@4'

Die Parameter für den Compiler standen bei dem Übungsprogramm dabei. Ich habe nur die Pfade und Dateinamen angepasst.


----------



## chibisuke (14. Januar 2004)

Also ich hab das prolem damals als ich damit gearbeitet hab so gelöst das ich die libmysql dateien direkt in mein projekt eingebunden hab...

Auf jedenfall weisen die fehlermeldungen darauf hin das er die libmysql.lib nicht findet, oder die datei defekt ist. kann auch sein das er wenn du die lib als DLL kompiliert hast die DLL datei dazu nicht findet, denn die wird meines wissens von manchen compilern beim kompilieren geprüft.


----------



## AndreWHV (14. Januar 2004)

> _Original geschrieben von chibisuke _
> *Also ich hab das prolem damals als ich damit gearbeitet hab so gelöst das ich die libmysql dateien direkt in mein projekt eingebunden hab...*


Ich habe die Datei libmysql.lib unter Projektoptionen, Parameters über den Button "Bibliothek/Objekt hinzufügen" eingebunden (ist hoffentlich die richtige Stelle bei Dev-C++).





> _Original geschrieben von chibisuke _
> *Auf jedenfall weisen die fehlermeldungen darauf hin das er die libmysql.lib nicht findet, oder die datei defekt ist. kann auch sein das er wenn du die lib als DLL kompiliert hast die DLL datei dazu nicht findet, denn die wird meines wissens von manchen compilern beim kompilieren geprüft. *



DLL und lib habe ich nicht kompiliert, die habe ich aus dem mySQL/lib Verzeichnis kopiert. 

Ich habe testweise mal alle mySQL.lib und dll Files in den Papierkorb geschoben und dann kompiliert. Komischerweise erscheint dieselbe Fehlermeldung. Insofern muss ich beim Linken immer noch was kräftig falsch machen. 

Frage mich nur wo.


----------



## chibisuke (14. Januar 2004)

äh.. ja ich glaub ich hab grad bemerkt was der fehler is...

GCC verarbeitet keine .lib dateien...

das einzige dateiformat das GCC als librarys verarbeitet ist soweit ich weiß .a

Das ist der grund wiso es nicht funktioniert...


----------



## AndreWHV (15. Januar 2004)

Das hatte ich auch schon versucht. Aber soweit wie ich in Erfahrung bringen konnte, kann gcc auch mit lib-Dateien arbeiten. Die IDE läßt dies auch standardmässig zu.
Trotzdem habe ich es versucht und mit folgenden Parameter die .a Datei erzeugt:

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

Dann die libmysql.a dem Projekt hinzugefügt und siehe da, immer noch derselbe Fehler.

Jetzt bleibt immer noch die Möglichkeit, dass die lib Datei kaputt ist, aber ich weiß nicht, wie man das überprüfen kann. Was ich schon gemacht habe ist, verschiedene Versionen der Lib-Datei zu verwenden (Quelle sind die mySQL Versionen von MySQL.com und XAMPP). 
Aber auch hier ohne Erfolg.

Inzwischen habe ich auch mit anderes IDE`s testen können (Visual C/C++ AutorenVersion und Borland C++ 4). Auch hier erscheinen dieselben Fehlermeldungen. Ich denke einen Fehler im Compiler selbst läßt sich so ausschliessen. 

Ich hoffe ich muss hier nicht ergebnislos abbrechen, wie einige Leute vor mir, die es auch schon probiert haben (inzwischen kenne ich schon einige Foren und Verzweifelte :sad:  )

Hier einmal die Ausgabe im Kompiler Log des Dev-C++

Compiler: Default compiler
Building Makefile: "C:\uebung\Makefile.win"
Finding dependencies for file: C:\uebung\main2.c
Führt  make... aus
make.exe -f "C:\uebung\Makefile.win" all
gcc.exe main2.o  -o "db2.exe" -L"C:/Dev-Cpp/lib" ../Dev-Cpp/lib/libmySQL.a 

main2.o(.text+0x27):main2.c: undefined reference to `mysql_init@4'
main2.o(.text+0x43):main2.c: undefined reference to `mysql_real_connect@32'
main2.o(.text+0x56):main2.c: undefined reference to `mysql_close@4'

make.exe: *** [db2.exe] Error 1

Ausführung beendet

Ich habe zwar schon verschiedene Quellcodes ausprobiert, aber vielleicht liegt ja auch der Fehler darin.

#include <windows.h> 
#include <mysql.h> 
#include <stdio.h> 

#define def_host_name	NULL
#define def_user_name	NULL
#define def_password	NULL
#define def_db_name	NULL



MYSQL	*conn,mysql;

int
main (int argc, char *argv[])
{
	mysql_init (&mysql);
	conn = mysql_real_connect (
				conn,
				def_host_name,
				def_user_name,
				def_password,
				def_db_name,
				0,
				NULL,
				0);
	mysql_close (conn);
	exit (0);
}


----------



## AndreWHV (15. Januar 2004)

Manchmal ist das Glück mit den Unwissenden. 

Ich habe die Lösung für mein Problem gefunden. 

Es ist soweit richtig, dass Dev-C++ nur *.a Dateien einlesen kann. Insofern vielen Dank für diesen Tip, sonst hätte ich es nicht nochmal ausprobiert. 

Was man noch machen muss, ist das Paket MySQL-4.0.16.DevPak zu installieren. Das hatte ich zwar gestern auch schon getan, aber heute aus lauter Verzweiflung noch mal gemacht und siehe da "Es werde Licht". 

Was genau dieses Programm macht weiss ich auch nicht, aber zumindest kommt man so weiter. Funktioniert allerdings nur mit dem im DEV-C++ enthaltenen Compiler. Mit anderen hatte ich noch keinen Erfolg damit. 

Den Link zu dem Programm habe ich hier gefunden http://www.tutorials.de/tutorials141390.html .

Vielen Dank für Deine Hilfe chibisuke.


----------

