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 :

déclaration multiple à l'édition de lien


Sujet :

C

  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut déclaration multiple à l'édition de lien
    bonjours, j'ai un probleme au moment du linkage ou on me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    misc.o:(.rodata+0x0): multiple definition of `STATJOBS'
    c_ursul.o:(.data+0x0): first defined here
    bon voici les codes de c_ursul.c , misc.c et protocol.h

    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
    #ifndef __PROTOCOL_H                                                                                                         
    #define __PROTOCOL_H
     
    /**************************************************************************
    ###########################################################################
    *
    *       Type & Enum Def 
    *
    ###########################################################################
    **************************************************************************/
    #define MAX_CMD 16
    #define MAX_CMD_LINE 8192 
    #define MAX_CMD_BYTE 4 
    #define MAX_PACKET_SIZE 4096 
    #define MAX_RESP_SIZE 64000 
     
     
     
    const unsigned char  STATJOBS [MAX_CMD_BYTE]   = {0x1A,0x00,0x00,0xFF};     
    ....
    #endif
    c_ursul.c et misc.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "include/misc.h"
    et dans misc.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef __MISC_H
    #define __MISC_H   
    #include "protocol.h"
    en faite ce que j'aimerai faire c'est utiliser le tableau STATJOBS dans c_ursul.c et dans misc.c Je sais pas si c'est possible. merci de votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Salut,

    Le problème c’est que tu définis une constante globale dans un fichier d’en-tête. Ce fichier étant inclus plusieurs fois dans plusieurs unités de traduction différente, tu vas définir plusieurs fois le même objet.
    Arrivé à l’édition des liens, l’éditeur de liens se retrouve avec plusieurs définition pour le même objet et il gueule.

    Deux solutions :
    1) Déclarer ta constante globale en statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const unsigned char STATJOBS [MAX_CMD_BYTE] = {0x1A,0x00,0x00,0xFF};
    Ce qui va limiter la portée de ta variable globale à l’unité de traduction courante. Par contre, misc.o et ursul.o auront chacun un objet STATJOBS (qui auront donc des adresses différentes).

    2) Faire une vraie globale.
    Dans ce cas il faut uniquement mettre la déclarations dans l’en-tête (et préciser extern), pas de définition.
    Puis, dans un (et un seul) des fichiers d’implémentation (ursul.c ou misc.c, au choix) tu pourras définir ta constante.
    Dans protocol.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern const unsigned char  STATJOBS [MAX_CMD_BYTE];
    Et dans ursul.c par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const unsigned char  STATJOBS [MAX_CMD_BYTE]   = {0x1A,0x00,0x00,0xFF};
    Dans ce cas, STATJOBS sera le même pour tout le monde (une globale vraiment globale).

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    merci, j'ai utilise les deux solutions et elle marche toute les deux. pour faire un choix j'aimerai savoir si possible qu'elles sont les avantages de l'une sur l'autre merci

    mis a part que passer en static me permet de sauver des lignes de code

  4. #4
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    À l’usage, comme tu l’as remarqué, aucune différence (car ta globale est une constante).

    Par contre, au niveau implémentation, seule la méthode 2 te donne une véritable constante globale (il n’y a qu’un seul et unique objet STATJOBS en mémoire).
    La solution 1 produit un objet STATJOBS par unité de traduction (ici 2), ce qui peut être gênant si ta constante globale est grosse.

    Un éventuel avantage pour la solution 1, mis à part l’économie de ligne de code et le fait d’avoir la déclaration et la définition au même endroit, c’est que comme le compilateur a accès à la définition de la constante dans chaque unité de traduction, il pourrait éventuellement faire plus d’optimisations.
    Mais bon, depuis que les compilo’ font de la LTO, je ne suis pas sûr qu’il y ai une différence visible à ce niveau-là entre 1 et 2.

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Merci pour les explications.
    pour info j'ai choisis la 2eme methode et ajouter un fichier protocol.c pour y mettre les declarations.
    Merci encore

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

Discussions similaires

  1. [VC++] Erreur d'édition des liens LNK1143
    Par Yellowmat dans le forum MFC
    Réponses: 6
    Dernier message: 01/02/2006, 15h00
  2. Réponses: 6
    Dernier message: 21/12/2005, 14h28
  3. [Dev-C++] Problème d'édition des liens
    Par shura dans le forum EDI
    Réponses: 5
    Dernier message: 30/08/2005, 09h35
  4. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50
  5. Déclaration multiple d'une fonction
    Par Julien C. dans le forum Langage
    Réponses: 2
    Dernier message: 17/06/2003, 16h38

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