C++, Visual C++ 2005 und MySQL

TCO99

Grünschnabel
Hallo,

ich bin noch relativ neu in der Programmierung und wahrscheinlich deshalb habe ich nun eine evtl. blöde Frage.

Bisher habe ich immer Konsolenprogramme geschrieben und bin damit eigentlich auch wunderbar klar gekommen. Die Programme schrieb ich bisher mit der IDE Dev-C++. Nun möchte ich aber anfangen und Programme mit einer GUI schreiben, wobei mir da VC++ in die Hände fiel (Studentenversion an der Uni ausgegeben).

Um mich mit VC++ anzufreunden habe ich eine Beispielanwendung von mir genommen und wollte diese erstmal als Win32 Konsolenprogramm kompilieren. Unter Dev-C++ läuft diese Anwendung, unter VC++ nicht.

Code:
/* mysql3.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#if defined __WIN32__ || _MSC_VER 
    #include <windows.h> 
#endif 
#include <mysql.h> 
using namespace std; 

/* Wegen sehr vielen malloc()-Aufrufen im Listing 
 * wurde hier zur Verkürzung des Listings ein Makro 
 * geschrieben, welches aber keine Schule machen soll!! 
 */ 
#define malloc(size) \ 
        malloc(size);\ 
        if( (size) == NULL)\ 
           {\ 
              printf("Kein Speicher mehr ...\n");\ 
              return;\ 
           } 

/* Funktionsprototypen */ 
void check_error(void); 
void verbinden(void); 
void verbindung_schliessen(void); 
void db_waehlen(char *); 
void print_line(MYSQL_RES *); 

MYSQL *mysql; 

/* 
 * Ab hier können Sie die einzelnen Funktion der 
 * kommenden Seiten einfügen 
 */ 

int main (int argc, char **argv) { 
  int auswahl; 
  char darsteller[255]; 
  char *ptr; 

  printf("Baue verbindung zur Datenbank auf ...\n\n"); 
  verbinden(); 
  db_waehlen("dvd_archiv"); 

  printf("Verbindung steht!\n"); 
  system("PAUSE"); 
  verbindung_schliessen(); 
  return EXIT_SUCCESS; 
} 

/* Bricht bei Fehler (mysql_error != 0) das Programm ab */ 
void check_error(void)  { 
   if (mysql_errno(mysql) != 0) { 
      fprintf(stderr, "Fehler: %s\n", mysql_error(mysql)); 
      system("PAUSE"); 
      exit(EXIT_FAILURE); 
   } 
} 

/* Baut eine Verbindung zum Datenbankserver auf. 
 * Passen Sie ggf. Usernamen und Passwort und, sofern 
 * andere Parameter benötigt werden, diese Ihren 
 * Umständen selbst an 
 */ 
void verbinden(void)  { 
   mysql=mysql_init(mysql); 
   check_error(); 
   mysql_real_connect(mysql, "localhost", "root", 
                      "", NULL, 0, NULL, 0); 
   check_error(); 
} 

/* Serververbindung wieder schließen und den Speicher für die 
 * Struktur MYSQL wieder freigeben */ 
void verbindung_schliessen(void)  { 
   mysql_close(mysql); 
} 

/* Falls Datenbank bei der Funktion verbinden() nicht angegeben 
 * wurde oder Sie die Datenbank wechseln wollen, dann verwenden 
 * Sie diese Funktion */ 
void db_waehlen(char *db) { 
   mysql_select_db(mysql, db); 
   check_error(); 
}

Unter Dev-C++ mußte ich nur die mySQL Includes bekannt machen und den Linker mit der Option "-lmysql" starten. Schon rennt diese Anwendung.

Nun zu dem eigentlich Problem:

Unter VC++ 2005 geht dies nicht. Ich habe die Includes bekannt gemacht aber ich weiß nicht, wie ich dem Linker sagen kann, daß er die o.g. Option nutzt. Dann bin ich mir nicht sicher, ob ich unter VC++ überhaupt eine windows.h habe. Muss ich da eine SDK installieren?

Ich hoffe ihr könnt mir helfen. Wenn ich nichtmal ein Konsolenprogramm mit VC++ hinbekomme, wie soll ich dann eine MFC Anwendung schaffen *argh*

Danke für's lesen :)
 
Um eine Bibliothek bekannt zu machen, gibt es zwei Möglichkeiten:

1. In der Projekt-Eigenschaften bei Linker->Eingabe->Zusätzliche Abhängigkeiten den Bibliotheksnamen "mysql.lib" eintragen.

2. Am Anfang des Quellcodes diese Präprozessoranweisung einfügen:
C++:
#pragma comment(lib,"mysql.lib")
Die Installation von VC beinhaltet auch das SDK, eine "windows.h" sollte also vorhanden sein.

Gruß
MCoder
 
Hat bisher noch nichts geholfen. Folgendes habe ich nun versucht:

-PSDK installiert (Anleitung nach: http://old.germangamedev.de/index.php?site=article&id=28)
- Inlcudes und Libs in der VC Umgebung registriert.
- dem Linker wie oben von Dir beschrieben gesagt, daß er mysql.lib nutzen soll.
- Pragma eingesetzt.
- und ne Menge Haare ausgerissen.

Hier mein aktueller Quellcode:

C++:
#include <stdafx.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <windows.h> 
#include <mysql.h> 
 
#pragma comment(lib,"mysql.lib")

/* Funktionsprototypen */ 
void check_error(void); 
void verbinden(void); 
void verbindung_schliessen(void); 
void db_waehlen(char *); 
void print_line(MYSQL_RES *); 

MYSQL *mysql; 

/* 
 * Ab hier können Sie die einzelnen Funktion der 
 * kommenden Seiten einfügen 
 */ 

int main (int argc, char **argv) { 
  int auswahl; 
  char darsteller[255]; 
  char *ptr; 

  printf("Baue verbindung zur Datenbank auf ...\n\n"); 
  verbinden(); 
  db_waehlen("dvd_archiv"); 

  printf("Verbindung steht!\n"); 
  system("PAUSE"); 
  verbindung_schliessen(); 
  return EXIT_SUCCESS; 
} 

/* Bricht bei Fehler (mysql_error != 0) das Programm ab */ 
void check_error(void)  { 
   if (mysql_errno(mysql) != 0) { 
      fprintf(stderr, "Fehler: %s\n", mysql_error(mysql)); 
      system("PAUSE"); 
      exit(EXIT_FAILURE); 
   } 
} 

/* Baut eine Verbindung zum Datenbankserver auf. 
 * Passen Sie ggf. Usernamen und Passwort und, sofern 
 * andere Parameter benötigt werden, diese Ihren 
 * Umständen selbst an 
 */ 
void verbinden(void)  { 
   mysql=mysql_init(mysql); 
   check_error(); 
   mysql_real_connect(mysql, "localhost", "root", 
                      "", NULL, 0, NULL, 0); 
   check_error(); 
} 

/* Serververbindung wieder schließen und den Speicher für die 
 * Struktur MYSQL wieder freigeben */ 
void verbindung_schliessen(void)  { 
   mysql_close(mysql); 
} 

/* Falls Datenbank bei der Funktion verbinden() nicht angegeben 
 * wurde oder Sie die Datenbank wechseln wollen, dann verwenden 
 * Sie diese Funktion */ 
void db_waehlen(char *db) { 
   mysql_select_db(mysql, db); 
   check_error(); 
}

Wie gesagt ist es als win32 / Konsolenanwendung erstellt worden.

Dies sind die Fehlermeldungen:

Code:
------ Build started: Project: mySQL_KonsolenConnect, Configuration: Debug Win32 ------ 
Compiling... 
mySQL_KonsolenConnect.cpp 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C2146: syntax error : missing ';' before identifier 'fd' 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(299) : error C2065: 'SOCKET' : undeclared identifier 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(299) : error C2146: syntax error : missing ')' before identifier 's' 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(300) : error C2059: syntax error : ')' 
Build log was saved at "file://c:\Dokumente und Einstellungen\Seth\Eigene Dateien\Visual Studio 2005\Projects\mySQL_KonsolenConnect\mySQL_KonsolenConnect\Debug\BuildLog.htm" 
mySQL_KonsolenConnect - 6 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ich bin wirklich ratlos. Ich kann genau dieses Programm fehlerfrei und Problemlos unter Dev-C++ zum laufen bringen (natürlich mit inlcudes, libs und linkeranweisung).

Wäre super, wenn jemand eine Lösung hat, ich verzweifle noch an dem VC :(
 
Hi.
TCO99 hat gesagt.:
Hat bisher noch nichts geholfen. Folgendes habe ich nun versucht:

-PSDK installiert (Anleitung nach: http://old.germangamedev.de/index.php?site=article&id=28)
Die Anleitung bezieht sich aber auf die Express 2005 Edition von VC++. Bei allen früheren Versionen sollte das PSDK bereits dabei sein.

TCO99 hat gesagt.:
- dem Linker wie oben von Dir beschrieben gesagt, daß er mysql.lib nutzen soll.
- Pragma eingesetzt.
Es reicht wenn du eine Variante nutzt. Entweder in die Projekteinstellungen hinzufügen, oder als pragma.
TCO99 hat gesagt.:
Dies sind die Fehlermeldungen:

Code:
------ Build started: Project: mySQL_KonsolenConnect, Configuration: Debug Win32 ------ 
Compiling... 
mySQL_KonsolenConnect.cpp 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C2146: syntax error : missing ';' before identifier 'fd' 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(155) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(299) : error C2065: 'SOCKET' : undeclared identifier 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(299) : error C2146: syntax error : missing ')' before identifier 's' 
c:\mysql-noinstall-4.1.16-win32\mysql-4.1.16-win32\include\mysql_com.h(300) : error C2059: syntax error : ')' 
Build log was saved at "file://c:\Dokumente und Einstellungen\Seth\Eigene Dateien\Visual Studio 2005\Projects\mySQL_KonsolenConnect\mySQL_KonsolenConnect\Debug\BuildLog.htm" 
mySQL_KonsolenConnect - 6 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Das sind ja erstmal Kompiler-Fehler, d.h. es hat nichts mit den Bibliotheken zu tun.

Ich hab etwas gegoogelt, und es scheint das es hilft die winsock.h zu inkludieren bevor man den mysql.h Header einbindet.

Gruß
 
Ich fasse es nicht. Genau daran lag es anscheinend. Ich mußte nur die winsock.h einbinden und schon ging es ohne zu mucken.

Nur meckert er jetzt beim ausführen des Programmes, daß er die libmysql.dll nicht finden kann (die ist aber ganz normal im lib Verzeichnis von mySQL zu finden). Muss ich die dll noch gesondert einfügen? Wenn ja, wie?

Noch ne kleine Verständisfrage (man will ja lernen): wieso muss ich unter dem VC die winsock.h einbinden und unter Dev-C++ nicht? So richtig verstehe ich das nicht *wunder*

EDIT:

Sowas blödes - mußte ja nur die dll zu meinem Projekt kopieren. Nun läuft alles. Vielen, vielen Dank Euch allen. Jetzt versuche ich das ganze mal mit GUI (erstmal "nur" MFC). DANK!
 
Zuletzt bearbeitet:
TCO99 hat gesagt.:
Nur meckert er jetzt beim ausführen des Programmes, daß er die libmysql.dll nicht finden kann (die ist aber ganz normal im lib Verzeichnis von mySQL zu finden). Muss ich die dll noch gesondert einfügen? Wenn ja, wie?
Du hast es ja schon gelöst, aber eine DLL wird nur an bestimmten Orten gesucht, wie z.B. dem Verzeichnis wo die ausführbare Datei liegt, dem aktuellen Verzeichnis usw. (siehe http://msdn2.microsoft.com/en-us/library/7d83bc18.aspx)

TCO99 hat gesagt.:
Noch ne kleine Verständisfrage (man will ja lernen): wieso muss ich unter dem VC die winsock.h einbinden und unter Dev-C++ nicht? So richtig verstehe ich das nicht *wunder*
Den genauen Grund weiß ich nicht. Es ist halt so das beim GCC von Dev-C++ und den Header Dateien die beim Dev-C++ dabei sind die winsock.h bzw. winsock2.h (automatisch) eingebunden wird und bei VC++ nicht. Würdest du z.B. den LCC verwenden würde auch automatisch die winsock.h von der mysql.h aus eingebunden werden.

Es gibt sicherlich einen guten Grund warum die MySQL Entwickler die winsock.h nicht einbinden wenn der MS C/C++ Kompiler am werkeln ist.

Gruß
 
Vielen Dank für die Erklärung. Daran habe ich ja garnicht gedachte, daß manche Compiler bereits Header einbinden könnten, obwohl man es nicht explizit sagt. Wieder etwas dazu gelernt.

Mensch, heute lerne ich wirklich eine Menge dazu: erst diese Problematik, und jetzt habe ich schon erste Ergebnisse für die GUI des Testes. Bringt wieder richtig Spaß :)
 
TCO99 hat gesagt.:
Noch ne kleine Verständisfrage (man will ja lernen): wieso muss ich unter dem VC die winsock.h einbinden und unter Dev-C++ nicht? So richtig verstehe ich das nicht *wunder*

Daran habe ich ja garnicht gedachte, daß manche Compiler bereits Header einbinden könnten, obwohl man es nicht explizit sagt
Also, der Compiler bindet von sich aus keine Header ein. Wenn man aber mit dem Projektassistenten eine MFC-Anwendung mit Socket-Unterstützung erzeugt, dann wird im dabei erzeugten Applikationsgerüstes der MFC-Header "afxsock.h" eingetragen. Dieser bindet bereits die "winsock.h" mit ein. Wohl aus dem Grund haben die MySQL-Entwickler in ihrem Header den Include der "winsock.h" über eine ifdef-Anweiasung so gesteuert, dass der bei VC nicht verwendet wird.

Gruß
MCoder
 
Zurück