Se connecter à une BDD MySQL par un programme en C++

Se connecter à une BDD MySQL par un programme en C++ - C++ - Programmation

Marsh Posté le 12-07-2005 à 12:56:04    

Bonjour bonjour
je suis prêt à m'immoler par le feu s'il le faut... accepteriez vous de m'expliquer tout en douceur ce qu'il faut faire pour que ça marche?  
J'ai bien regardé autour de moi sur ce forum et même ailleurs mais ce qui cionce c'est la mise en place de l'environnement je pense...
Je suis un bon gros débutant sous linux (fedora core 3 pour les intimes) et l'on m'a dit qu'il fallait installer des tas de librairies pour faire foncionner du mysql avec du c++ (je débute d'ailleurs aussi avec ces deux choses... dur!)
en vrac j'ai exploité en bonne et due forme des fichiers rpm (mysql++, mysql_shared, myclient etc...) puis j'ai essayé de mettre en place en petite connexion sur une base de données existante, à laquelle on arrive très bien à accéder en mode console disons... mais il y a tout de même un bon paquet d'erreurs qui stipulent que toutes les fonctions de base (mysql_real_connect par exemple ) sont plus qu'inconnues au bataillon...
Je m'interroge... ne faut il pas en plus des fichiers .h des .c qui explicitent les dites fonctions?  
je place comme il semble d'usage le code qui devrait fonctionner - bordel à culs
et je vous remercie en vous embrassant sur les tétés - d'usage aussi ça ?
 
 

Code :
  1. #include <stdio>
  2. #include <stdlib>
  3. #include <mysql++>
  4. void connexion_db (MYSQL * conn_db) {
  5. mysql_init(conn_db);
  6. if (!mysql_real_connect(conn_db,"127.0.0.1","root","root",0,NULL,0)){
  7.      fprintf(stderr,"petite erreur dans la connexion : %s\n",mysql_error(conn_db));
  8.      exit(0);
  9. }
  10. }


 
 
 
Quand je tape la commande g++ -g -o essai essai.cpp dans le répertoire où se trouve le dit essai.cpp les erreurs pleuvent jusqu'à plus soif du style :
 
 
/usr/lib/gcc/i386-redhat-linux/3.4.2/../../../crt1.o(.text+0x18): in function '_start':
: undefined reference to 'main'
/tmp/ccW0fYLt.o(.text+0xd): In function 'db_connect(st_mysql*)':  
/home/camille/essai_sql/essai.cpp:7: undefined reference to 'mysql_init'
 
etc..
 
merci encore

Reply

Marsh Posté le 12-07-2005 à 12:56:04   

Reply

Marsh Posté le 12-07-2005 à 13:38:21    

Citation :


/usr/lib/gcc/i386-redhat-linux/3.4.2/../../../crt1.o(.text+0x18): in function '_start':
: undefined reference to 'main'


[:totozzz]

Citation :

g++ -g -o essai essai.cpp


tu as oublié de prendre en compte le linker il te faut rajouter un -lnomdetabib à la fin de ta ligne de commande.

Reply

Marsh Posté le 12-07-2005 à 14:02:24    

merki beaucoup,  
un talent à toute épreuve donc puisque les fonctions de connecteur - oui, j'ai entre temps reçu quelques explications habiles mais probes de personnes habilitées... - sont tout à fait reconnues...
je retombe cependant sur un problème auquel j'ai précedemment fait face et qui a là aussi gagné la bataille - mais pas la guerre :  
dans le fichier mysql.h qui décrit semble t il les principaux types utilisables par la suite, une structure a été définie, elle s'appelle MEM_ROOT mais tout se passe comme si on ne lui passait pas sur le corps lorsque le fichier .h est lu - si tant est que cela se passe comme cela...
La structure est la suivante:  
 
#ifndef ST_USED_MEM_DEFINED
#define ST_USED_MEM_DEFINED
typedef struct st_used_mem
 {                                  /* struct for once_alloc (block) */
   struct st_used_mem *next;        /* Next block in use */
   unsigned int  left;              /* memory left in block  */
   unsigned int  size;              /* size of block */
 } USED_MEM;
 
 
 typedef struct st_mem_root
 {
   USED_MEM *free;                  /* blocks with free memory in it */
   USED_MEM *used;                  /* blocks almost without free memory */
   USED_MEM *pre_alloc;             /* preallocated block */
   /* if block have less memory it will be put in 'used' list */
   unsigned int min_malloc;
   unsigned int block_size;         /* initial block size */
   unsigned int block_num;          /* allocated blocks counter */
       
   void (*error_handler)(void);
 } MEM_ROOT;
 #endif
 
 
alors voila plusieurs interrogations s'offrent à mes petits yeux inquisiteurs:
- quelle est la différence si on ne met plus le dernier MEM_ROOT juste avant le point virgule, est ce que c'est ' une sorte d'alias ' ou bien?
- si je change ce même MEM_ROOT en MEM_ROOTS il continue à faire son même foin donc il ne passe jamais dans ce coin de code et pourtant il ne dit rien pour USED_MEM
 
enfin voilà on m'a soufflé aussi une possible nécessité d'utilisation de la commande ldconfig pour bien dire où sont les librairies et autres fichiers nécessaires à une compilation digne de ce nom...
 
Tchao bongo et merci

Reply

Marsh Posté le 12-07-2005 à 14:12:49    

oui...
en fait l'erreur qui apparaît est comme suit - plus compréhensible peut être que le charabia ci dessus...
usr/include/mysql.h:128: erreur: "MEM_ROOT " ne nomme pas un type
 
là je dis: pas esprit jeux olympiques !
 
bizzz
 

Reply

Marsh Posté le 12-07-2005 à 17:45:36    

[quotemsg=1147833,3,291376]merki beaucoup,  
un talent à toute épreuve donc puisque les fonctions de connecteur - oui, j'ai entre temps reçu quelques explications habiles mais probes de personnes habilitées... - sont tout à fait reconnues...
je retombe cependant sur un problème auquel j'ai précedemment fait face et qui a là aussi gagné la bataille - mais pas la guerre :  
dans le fichier mysql.h qui décrit semble t il les principaux types utilisables par la suite, une structure a été définie, elle s'appelle MEM_ROOT mais tout se passe comme si on ne lui passait pas sur le corps lorsque le fichier .h est lu - si tant est que cela se passe comme cela...
La structure est la suivante:  
 
#ifndef ST_USED_MEM_DEFINED
#define ST_USED_MEM_DEFINED
typedef struct st_used_mem
 {                                  /* struct for once_alloc (block) */
   struct st_used_mem *next;        /* Next block in use */
   unsigned int  left;              /* memory left in block  */
   unsigned int  size;              /* size of block */
 } USED_MEM;
 
 
 typedef struct st_mem_root
 {
   USED_MEM *free;                  /* blocks with free memory in it */
   USED_MEM *used;                  /* blocks almost without free memory */
   USED_MEM *pre_alloc;             /* preallocated block */
   /* if block have less memory it will be put in 'used' list */
   unsigned int min_malloc;
   unsigned int block_size;         /* initial block size */
   unsigned int block_num;          /* allocated blocks counter */
       
   void (*error_handler)(void);
 } MEM_ROOT;
 #endif
 
C'est une structure en C çà pas en C ++


---------------
"Donne un poisson à un homme, et tu le nourris pour un jour.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed