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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  3. #3
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    ca serait plutot "-L/usr/lib/mysql"

  6. #6
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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 éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    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 : 480
    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