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 :

Compilation échoue avec gcc 2.96 (drand48_data et #pragma pack)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut Compilation échoue avec gcc 2.96 (drand48_data et #pragma pack)
    Bonjour,

    J'ai fait un programme qui compile très bien avec gcc 4.4.7. Sauf que j'ai besoin que celui-ci compile également avec gcc 2.96. Et ça ne fonctionne pas malheureusement.

    Voilà les erreurs générées :

    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
     
    g++ -pthread -lrt  -g -static -W -Wall -ansi -pedantic    -c -o automatique.o automatique.cpp
    In file included from destinataire.h:24,
                     from automatique.cpp:22:
    enum.h:112: field `random_buffer' has incomplete type
    enum.h:115: warning: malformed `#pragma pack'
    enum.h:115: warning: ignoring pragma: 
    enum.h:137: warning: malformed `#pragma pack'
    enum.h:137: warning: ignoring pragma: 
    enum.h:155: warning: malformed `#pragma pack'
    enum.h:155: warning: ignoring pragma: 
    enum.h:171: warning: malformed `#pragma pack'
    enum.h:171: warning: ignoring pragma: 
    automatique.cpp: In function `void Automatique::automatique (int, char 
    **)':
    automatique.cpp:196: aggregate `DRAND48_DATA randBuffer_mono' has 
    incomplete type and cannot be initialized
    automatique.cpp:197: `sizeof' applied to incomplete type `DRAND48_DATA'
    automatique.cpp:198: `srand48_r' undeclared (first use this function)
    automatique.cpp:198: (Each undeclared identifier is reported only once 
    for each function it appears in.)
    automatique.cpp:222: `struct Infos' has no member named `random_buffer'
    automatique.cpp:348: invalid use of undefined type `struct 
    DRAND48_DATA'
    enum.h:112: forward declaration of `struct 
    DRAND48_DATA'
    automatique.cpp:364: invalid use of undefined type `struct 
    drand48_data'
    enum.h:112: forward declaration of `struct 
    drand48_data'
    automatique.cpp:365: `struct Infos' has no member named `random_buffer'
    automatique.cpp:365: invalid use of undefined type `struct 
    drand48_data'
    enum.h:112: forward declaration of `struct 
    drand48_data'
    automatique.cpp:426: invalid use of undefined type `struct 
    drand48_data'
    enum.h:112: forward declaration of `struct 
    drand48_data'
    make: *** [automatique.o] Erreur 1
    Ainsi les coupables #pragma pack et struct drand48_data ne semblent pas être supportés par la version 2.96 de gcc.

    Quelqu'un aurait-il donc une suggestion pour contourner ce problème ?

    Merci

  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
    pragma 4 est une pragma sans "importance" dans le sens qu'elle n'empeche pas la compilation. Ca va juste pourrir l'alignement supposé des structures.

    Par contre le srand48_r est plus génant.
    Où est-il normalement défini?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Citation Envoyé par leternel Voir le message
    pragma 4 est une pragma sans "importance" dans le sens qu'elle n'empeche pas la compilation. Ca va juste pourrir l'alignement supposé des structures.
    Je préfèrerais ne pas trop les pourrir si possible

    Citation Envoyé par leternel Voir le message
    Par contre le srand48_r est plus génant.
    Où est-il normalement défini?
    Voilà la structure qui pose problème dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #pragma pack(1) // besoin d'une alternative pour gcc 2.96
    typedef struct Infos{ 
        ty_mode mono_multi;         
        ty_mode mode;  
        ty_position state;
        u_int period;
        u_int period_max; 
        time_t time_input; 
        u_int check_ack;
        struct drand48_data random_buffer;  // besoin d'une alternative pour gcc 2.96
        u_int nb_timeout_t; 
    }INFOS;
    #pragma pack(0)
    C'est ce que tu voulais savoir quand tu dis "normalement défini" ?

    Sinon j'utilise srand48_r dans la fonction automatique() comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DRAND48_DATA randBuffer_mono; // DRAND48_DATA = typedef de struct drand48_data
    memset(&randBuffer_mono, 0, sizeof(DRAND48_DATA));
    srand48_r(time(NULL), &randBuffer_mono);

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    automatique.cpp:196: aggregate `DRAND48_DATA randBuffer_mono' has 
    incomplete type and cannot be initialized
    automatique.cpp:197: `sizeof' applied to incomplete type `DRAND48_DATA'
    automatique.cpp:198: `srand48_r' undeclared (first use this function)
    automatique.cpp:198: (Each undeclared identifier is reported only once 
    for each function it appears in.)
    Ces messages signifient que DRAND48_DATA est un type incomplet, dont la définition manque au point d'appel.
    Tu n'as qu'une déclaration anticipée de struct drand48_data, sans avoir son contenu.

    Il manque un include avant le code provoquant les erreurs.

    Je ne connais pas struct drand48_data, donc je ne peux pas te dire quel fichier inclure précisément.
    edit: google dit: #include <drand48_r_libgw32c.h>

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Citation Envoyé par leternel Voir le message
    Je ne connais pas struct drand48_data, donc je ne peux pas te dire quel fichier inclure précisément.
    edit: google dit: #include <drand48_r_libgw32c.h>
    ça serait plus pour Windows ça. A priori pour Linux seul stdlib.h suffit comme include pour drand48. Est-ce qu'il serait possible que drand48 ou srand48 ne soient pas supportés par ce vieux gcc? Et serait-il possible de définir la structure drand48_data directement dans le code ?

    Comme ceci peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct drand48_data
    {
      unsigned short int __x[3]; /* Current state. */
      unsigned short int __old_x[3]; /* Old state. */
      unsigned short int __c; /* Additive const. in congruential formula. */
      unsigned short int __init; /* Flag for initializing. */
      uint64 __a; /* Factor in congruential formula. */
    };

  6. #6
    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
    Apparemment, c'est une extension de la lib standard.
    Il est bien possible qu'elle n'existe pas.

    Si c'est le cas, quand bien même tu parviendrais à créer la structure, le code des fonctions n'existerait pas.
    Tu dois cependant pouvoir importer ce code.

    Par ailleurs, pourquoi vouloir utiliser un gcc 2.x?
    Alors qu'on en est à la 4.8 et qu'un tel écart implique des différences de performances?

Discussions similaires

  1. Compiler Qt avec GCC 4.6.1
    Par Mrpantalon dans le forum Débuter
    Réponses: 0
    Dernier message: 01/10/2011, 14h06
  2. compiler dll avec gcc
    Par ayarikhaoulakoukou dans le forum C
    Réponses: 4
    Dernier message: 19/04/2011, 10h46
  3. compilation avec gcc: erreur inhabituelle
    Par artatum dans le forum C
    Réponses: 4
    Dernier message: 12/10/2005, 17h13
  4. Problème de compilation avec gcc
    Par Niktou dans le forum Linux
    Réponses: 9
    Dernier message: 27/09/2005, 15h18
  5. compilation avec gcc : erreurs bizard !!!
    Par CodeurNé dans le forum C
    Réponses: 2
    Dernier message: 23/09/2005, 18h09

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