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 :

probleme compilation variable externe


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut probleme compilation variable externe
    Bonjour,

    voilà mon problème :

    J'ai actuellement une constante defini dans un .h
    Cette constante est utilisée dans une dizaine de fichiers.
    Actuellement, je voudrais faire varier la valeur de cet "élément" au cours de mon process mais sans impacter les fichiers qui l'utilisent.
    Du coup, je n'utilise plus de constante (normal!!)

    J'ai décidé d'utiliser une variable externe du même nom que je déclare dans le même .h (pour que les .c utilisant auparavant la constante ne voient pas la différence) et j'initialise ma constante dans un fichier d'init pré-existant.

    toto.h
    extern int MY_INDEX;

    init.c
    int MY_INDEX = 0;

    Lorsque je compile tout mon projet, l'erreur "undefined reference to MY_INDEX" apparait pour les fichiers qui utilisaient l'ancienne constante MY_INDEX.

    A noter que toto.h est un .h contenant des définitions d'objets et n'a donc pas de .c associé.

    Je sais qu'en rajoutant le type devant le nom de la variable, cela devrait compiler mais mon objectif est de ne pas modifier les autres fichiers l'utilisant

    Y-a t-il une façon de faire cela ?
    Peut etre que je ne dois pas utiliser de variable externe ?

    Merci d'avance
    Kanonji

    PS: pour info, j'ai essayé la pirouette suivante:
    toto.h
    #define MY_INDEX (int TEMP_INDEX)
    extern int TEMP_INDEX;

    init.c
    int TEMP_INDEX=0;

    autre.c
    int TEMP_INDEX=i;

    mais j'ai quand même le problème de compilation.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    "undefined reference to MY_INDEX" me semble être une erreur de link et pas de compilation.

    Est ce que le fichier init.c (dans lequel est déclaré ta nouvelle variable) est bien inclut dans ton projet ?

    Est ce que l'on pourrait avoir le message d'erreur complet ainsi que le code source référencé par le message d'erreur ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    Bonjour,

    voila le message d'erreur complet:
    make: Making shared library libMyObjects.so.1.1 ...
    ./testobj.o(.text+0x1498): In function `MyObjectCreation':
    C/testobj.c:290: warning: undefined reference to `TEMP_MY_INDEX`

    testobj.c:
    #include "toto.h"
    ...
    IntInfoLoc=LocationInfo(pStartLoc+MY_INDEX);

    toto.h
    #define MY_INDEX (int TEMP_MY_INDEX)
    extern int TEMP_MY_INDEX;

    init.c
    int TEMP_MY_INDEX = 0;

    update.c
    int TEMP_MY_INDEX = idx;


    Pour info, si je mets la constante MY_INDEX en variable externe directement, j'ai le même problème.

    Kanonji

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pour info, c'est bien un problème de link et pas de compilation que tu as

    Par contre, ce que tu fais est bizarre et je ne comprends pas comment cela marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MY_INDEX (int TEMP_INDEX)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntInfoLoc=LocationInfo(pStartLoc+MY_INDEX);
    devraient produire une erreur car cela revient à "IntInfoLoc=LocationInfo(pStartLoc+int TEMP_INDEX);" ce qui n'est pas valide en C.

    A mon avis, la bonne manière de faire (aux variables globales près mais c'est une autre histoire ), c'est ce que tu as commencé à exposer :

    fichier toto.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //#define MY_INDEX 0 // mis en commentaire
    extern int MY_INDEX;
    fichier init.c
    et c'est tout

    Après, tu auras peut être des problèmes sur quelques déclarations qui deviennent invalides.
    char tab[MY_INDEX] est valide avec un #define mais peut devenir invalide avec une variable par exemple
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    Merci pour les infos,

    je vais réessayer avec ma constante directement transformée en variable externe.

    Par contre, j'ai quand même une question.

    Si j'utilise ma variable externe, est ce obligatoire de toujours préciser le type lorsque je l'utilise ?

    ex: IntInfoLoc=LocationInfo(pStartLoc+MY_INDEX);
    devra t-il etre change en
    IntInfoLoc=LocationInfo(pStartLoc+ (int) MY_INDEX);

    Kanonji

    PS: si j'ai un problème de compil' similaire avec ma variable externe directe, je vous le ferais savoir.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    Bonjour,

    j'ai toujours le même problème de link.

    Making shared library libMyObjects.so.1.1 ...
    ./testobj.o(.text+0x1498): In function `MyObjectCreation':
    C/testobj.c:290: warning: undefined reference to `MY_INDEX`


    Le code de testobj.c n'a pas changé. Ce qui a changé, c'est que MY_INDEX n'est plus une constante mais une variable externe (toujours défini dans toto.h)

    Quelqu'un aurait il une idée de la raison de cette erreur ?

    Kanonji

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut
    Quelqu'un aurait-il une idée pour la raison de ce problème de link ?

    Est ce du au fait que ma variable externe est définie dans un .h (qui n'a pas de .c et qui ne peut pas en avoir) ?

    La compilation et le link du fichier qui contient l'initialisation de la variable se fait bien. C'est au niveau des fichiers qui contiennent l'ancienne constante (et qui inclut donc bien le .h qu'il faut) que le message d'erreur apparait.

    Merci d'avance de votre aide.

    Kanonji

Discussions similaires

  1. probleme passage variables swf externe
    Par flo73 dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 19/04/2011, 07h44
  2. Réponses: 7
    Dernier message: 18/06/2008, 18h00
  3. [algo]probleme de variables hotes ds un insert
    Par omega dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2004, 09h03
  4. Réponses: 2
    Dernier message: 04/01/2004, 15h14
  5. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

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