IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

undefined symbol: mysql_real_connect


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut undefined symbol: mysql_real_connect
    Bonjour,

    J'ai fait pas mal de recherche mais je ne trouve pas ce qui coince.
    Je crée une librairie C et j'appelle les fonctions à partir de python.

    La fonction de connexion dans le fichier DataBaseAccess.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <my_global.h>
    #include <mysql.h>
     
    ...
     
    Mafonction * getDataFromId(int Id, Personnage * currentPersonnage) {
    	//Create and initialize a connection handle object
    	MYSQL connection;
    	if (mysql_init(&connection) == NULL) {
    		printf("Connection handle initialization failed !\n");
    		exit(1);
    	}
     
    	//Connect to MySQL server
    	if (mysql_real_connect(&connection, "localhost", "user", "password", "dbname", 3306, NULL, 0) != NULL) {
    		printf("Connection to remote MySQL server established\n");
    	} else {
     
    		printf("Connection attempt to remote MySQL failed !\n");
    		exit(1);
    	}
     
    	//Close the connection
    	mysql_close(&connection);
    	return 0;
    }

    La ligne de commande de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -I/usr/include/mysql -lmysqlclient -fPIC -g3 -o  DataBaseAccess.o -c DataBaseAccess.c
    Aucun problème à la compilation.

    En ligne de commande python, je charge la librairie, puis j'appelle la fonction.
    J'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    Lib = ct.cdll.LoadLibrary('../../lib/DataBaseAccess.so')
      File "/usr/lib/python2.7/ctypes/__init__.py", line 440, in LoadLibrary
        return self._dlltype(name)
      File "/usr/lib/python2.7/ctypes/__init__.py", line 362, in __init__
        self._handle = _dlopen(self._name, mode)
    OSError: ../../lib/DataBaseAccess.so: undefined symbol: mysql_real_connect
    Une idée ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 188
    Points : 17 139
    Points
    17 139
    Par défaut
    Il te manque peut-être un "-L/quelque/part" pour indiquer un chemin supplémentaire où chercher la bibliothèque mysql.
    tu indiques bien "-lmysqlclient" à la compilation, mais cela signifie seulement que la bibliothèque doit être liée, mais elle peut ne pas être trouvée.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ternel Voir le message
    Il te manque peut-être un "-L/quelque/part" pour indiquer un chemin supplémentaire où chercher la bibliothèque mysql.
    tu indiques bien "-lmysqlclient" à la compilation, mais cela signifie seulement que la bibliothèque doit être liée, mais elle peut ne pas être trouvée.
    J'ai changé
    par
    Mais à la compilation, il y a le message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataBaseAccess.c:1:23: fatal error: my_global.h: Aucun fichier ou dossier de ce type
    J'en conclus que
    est suffisant, non ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    -I sert à ajouter un répertoire d'include, pour trouver les fichiers à #include
    -L sert à ajouter un répertoire de link, pour trouver les fichier à link, .a, .lib, ...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 188
    Points : 17 139
    Points
    17 139
    Par défaut
    ca serait plutot "-L/usr/lib/mysql"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par ternel Voir le message
    ca serait plutot "-L/usr/lib/mysql"
    J'ai compilé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -I/usr/include/mysql -lmysqlclient -L/usr/lib/mysql -fPIC -g3 -o DataBaseAccess.o -c DataBaseAccess.c
    Ca n'a rien changé.

  7. #7
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    J'ai créé un fichier .c pour une connexion à la base de données.
    Après compilation et exécution, cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <mysql.h>
    #include <stdio.h>
     
    int main() {
       MYSQL *conn;
       MYSQL_RES *res;
       MYSQL_ROW row;
     
       char *server = "localhost";
       char *user = "user";
       char *password = "password"; /* set me first */
       char *database = "dbname";
     
       conn = mysql_init(NULL);
     
       /* Connect to database */
       if (!mysql_real_connect(conn, server,
             user, password, database, 0, NULL, 0)) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
       }
     
       /* send SQL query */
       if (mysql_query(conn, "show tables")) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
       }
     
       res = mysql_use_result(conn);
     
       /* output table name */
       printf("MySQL Tables in mysql database:\n");
       while ((row = mysql_fetch_row(res)) != NULL)
          printf("%s \n", row[0]);
     
       /* close connection */
       mysql_free_result(res);
       mysql_close(conn);
    }
    Il semble donc que l'erreur décrite au début soit plutôt côté Python.
    Mais pourquoi Python essaie de chercher la fonction mysql_real_connect "chez lui" alors que je lui dis d'utiliser une librairie C ?

  8. #8
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Après d'autres recherches, j'ai l'impression que c'est à la compilation qu'il y a un souci.

    renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl
    renvoie
    Je mets donc dans ma ligne de commande de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -fPIC -g3 -I/usr/include/mysql -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -o DataBaseAccess.o -c DataBaseAccess.c
    Et bien toujours pareil

  9. #9
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    J'ai fait la compilation étape par étape pour voir ce que ça donne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -fPIC -g3 -o DataBaseAccess.o -c DataBaseAccess.c
    Il y a une erreur, c'est normal, je ne lui dis pas où se trouve mysql.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -fPIC -g3 -I/usr/include/mysql -o DataBaseAccess.o -c DataBaseAccess.c
    Compilation OK.
    Mais toujours l'erreur "undefined symbol: mysql_real_connect".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -O3 -fPIC -g3 -I/usr/include/mysql -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -o DataBaseAccess.o -c DataBaseAccess.c
    Compilation OK.
    Mais toujours l'erreur "undefined symbol: mysql_real_connect".

    Donc on dirait que "-lmysqlclient" ne change rien.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Tu as bien un libmysqlclient.a quelquepart ? Où ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu as bien un libmysqlclient.a quelquepart ? Où ?
    Oui, il est dans usr/lib/x86_64-linux-gnu.

    Mais s'il n'y était pas, ce que j'ai fait dans le post 7 ne fonctionnerait pas non plus, non ?

  12. #12
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu as bien un libmysqlclient.a quelquepart ? Où ?
    Oui, il est dans usr/lib/x86_64-linux-gnu.

  13. #13
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Ca y est, j'ai trouvé.

    Il faut lancer la compilation dans un ordre EXACT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O3 -fPIC -g3 -I/usr/include/mysql -o votre_librairie.o -c votre_librairie.c
    gcc -O3 -fPIC -shared -o votre_librairie.so votre_librairie.o -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. undefined symbol "enum"
    Par djallal dans le forum C
    Réponses: 2
    Dernier message: 02/03/2007, 22h29
  2. virtual et héritage, ld undefined symbol
    Par grodwar dans le forum C++
    Réponses: 2
    Dernier message: 03/01/2007, 09h00
  3. [E2451] Undefined symbol 'att_nombre'
    Par kaizer dans le forum C++
    Réponses: 9
    Dernier message: 22/10/2006, 13h53
  4. probleme a la compilation:Undefined symbols
    Par djobanaille dans le forum C++
    Réponses: 3
    Dernier message: 07/12/2005, 15h33
  5. Undefined symbol
    Par tchoimars dans le forum C
    Réponses: 2
    Dernier message: 02/12/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo