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 :

Edition des liens: "symbol has different size"


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut Edition des liens: "symbol has different size"
    Bonjour à tous,

    Je travaille sur un micro-contrôleur Freescale 68HC12 avec la suite Metrowerks CodeWarrior. Lors de l'édition des liens, j'ai un warning qui m'est incompréhensible : "L1827: Symbol __as__appFRC3app has different size in app.cpp.o (102 bytes) and main.cpp.o (103 bytes)"...

    Voici le fichier app.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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #ifndef APP_H
    #define APP_H
     
    #include "btn.h"
    #include "pot.h"
    #include "brt.h"
    // #include "led.h"
     
    class app
    {
     
        private:
     
            btn bouton1;
            btn bouton2;
            pot poti1;
            pot poti2;  
            inp* inputs[ 4 ];    
            brt bruiteur;
            int frequence;
            int volume;
            int on;
     
        public:
     
            app();
            void Init();
            void ScanInputs();
            void RefreshOutputs();  
     
    };
     
    #endif
    et le main.cpp :

    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
    40
    41
    42
    43
    44
    45
     
    #include <hidef.h>       /* common defines and macros */
    #include <mc9s12dp256.h> /* derivative information    */
     
    #include "OS.h"
    #include "OS_Task.h"
    #include "app.h"
    #include "stack.h"
     
    #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
     
    #define COP_RESET() ARMCOP = 0x00	
     
    app Application;
     
    extern "C" void taskScan( void )
    {
        Application.ScanInputs();
    }
     
    extern "C" void taskRefresh( void )
    {
        Application.RefreshOutputs();
    }
     
    extern "C" void taskFeedCop( void )
    {
        _FEED_COP();
    }
     
    extern "C" void taskCheckStack( void )
    {
        if ( !STACK_chk() )
            COP_RESET();   
    }
     
    void main( void )
    {
     
        OS_Init();
        Application.Init();
     
        OS_Run();
     
    }
    Le truc étrange, c'est que si j'enlève le commentaire pour l'inclusion de "led.h" dans le fichier app.h (cette inclusion n'est pourtant pas nécessaire), le warning disparaît

    Est-ce que quelqu'un aurait une idée du problème ? Merci...

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Ca ressemblerait à une erreur de ce genre :
    fichier1.cpp : extern int *pi;
    fichier2.cpp : extern int pi[20];
    Ou alors un problème d'alignement ?

    Est-ce que les 2 fichiers ont les mêmes options de compilation ?

    A quoi ressemblent les déclarations de __as__appFRC3app ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    __as__appFRC3app fait référence au constructeur de la classe app, défini une seule fois.

    Je pense qu'il s'agit bien d'un problème d'alignement, en déclarant la partie "public" avant "private" dans app.h je n'ai plus de warning...

    Dans main.cpp, j'utilise cette option de compilation en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
    Devrais-je l'utiliser dans tous les autres fichiers ? Merci pour ton aide !

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    A quoi ressembe app.cpp ?
    Concernant l'option de link, je ne la connais pas. Donc difficile de te dire s'il faut la répéter ou pas...

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Voici le contenu du fichier app.cpp :

    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 "app.h"
     
    #include "OS_Task.h"   
     
    #include "dio.h"
    #include "atd.h"
    #include "led.h"
    #include "pwm.h"
     
    app::app() : bouton1(2), bouton2(3), poti1(5), poti2(6), bruiteur(5,7),
                 frequence(0), volume(0), on(0)
    {
      inputs[0] = &bouton1;
      inputs[1] = &bouton2;
      inputs[2] = &poti1;
      inputs[3] = &poti2;
    }
     
    void app::Init()
    {
     
      dio_open();
      atd_open();
      led_open();
      pwm_open();
     
      (void)OS_ActivateTask(OS_TaskScan, 20, 10);
      (void)OS_ActivateTask(OS_TaskRefresh, 55, 100);
     
    }
     
    void app::ScanInputs()
    { 
    }
     
    void app::RefreshOutputs()
    {
    }
    L'option de link permet de définir quel est le modèle exact du dérivatif (matériel) utilisé. Apparemment il n'y a besoin de l'écrire qu'une seule fois, j'ai quand même essayé de l'ajouter également dans tous les autres fichiers, ça n'a rien changé.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Désolé je vois pas
    Tu peux essayer par 'incrément' : tu déshabilles app jusqu'à disparition du warning et tu tritures tes neurones pour voir pourquoi

  7. #7
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Je pense que ça vient effectivement de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
    Aucun compilateur ne génèrera par défaut une structure de 103 bytes pour tes données (ça devrait aligné sur 4 bytes). Donc je pense que ça vient de là.

    Je te conseillerai bien d'ajouter cette directive dans un fichier d'entête commun à tout ton projet (ou de la supprimer), par contre, je n'ai aucune idée de à quoi elle sert et des impacts possibles...

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    J'ai essayé d'ajouter la directive dans tous les fichiers, puis aussi de la supprimer partout, mais c'est toujours pareil...Par contre si je vire les attributs "frequence", "volume", et "on", le warning disparaît

    Le programme fonctionne bien mais c'est tout de même étrange ! Et puis j'ai déjà eu des problèmes avec la suite que j'utilise, qui est une vieille version mais que je suis obligé d'utiliser, alors je commence à me demander si le problème ne viendrait pas d'elle

  9. #9
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    rajoute plutot un champs de 8bit vide pour l'alignement. A ce que j'ai compris, il s'agit juste d'un défaut d'alignement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     struct machine {
    unsigned int : 8 ; //saut d'alignement
    }
    Et change de compilateur aussi tôt que possible. Un compilateur qui ne fait même pas les saut d'alignement tout seul, >< quoi (Mathusalem powa) !

Discussions similaires

  1. Edition des liens d'une bibliothèque sans .lib
    Par Matthieu Brucher dans le forum Visual C++
    Réponses: 5
    Dernier message: 08/02/2007, 22h00
  2. Template + probleme à l'édition des liens
    Par ExSter dans le forum Langage
    Réponses: 11
    Dernier message: 07/12/2006, 23h13
  3. Réponses: 5
    Dernier message: 03/12/2006, 16h15
  4. Problème d'édition des liens
    Par keyra dans le forum C
    Réponses: 9
    Dernier message: 30/04/2006, 12h48
  5. Edition des liens croisée
    Par Matthieu Brucher dans le forum Windows
    Réponses: 3
    Dernier message: 22/03/2006, 00h08

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