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 :

erreur en ajoutant option -wall


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Par défaut erreur en ajoutant option -wall
    Bonjour,

    j'ai fais un petit programme pour comparer lesm anières de passer une variable, le programme fonctionne bien si je compile avec cette ligne :

    Mais si je change par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -o -wall out main.cpp
    J'ai vraiment beaucoup d'erreurs du genre :

    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
    out: In function `_start':
    /build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: multiple definition of `_start'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: first defined here
    out:(.rodata+0x0): multiple definition of `_fp_hw'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.rodata+0x0): first defined here
    out: In function `_fini':
    /build/buildd/glibc-2.9/csu/../sysdeps/generic/initfini.c:109: multiple definition of `_fini'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/csu/../sysdeps/generic/initfini.c:109: first defined here
    out:(.rodata+0x4): multiple definition of `_IO_stdin_used'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
    out: In function `__data_start':
    (.data+0x0): multiple definition of `__data_start'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.data+0x0): first defined here
    out: In function `__data_start':
    (.data+0x4): multiple definition of `__dso_handle'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/crtbegin.o:(.data+0x0): first defined here
    out: In function `_init':
    /build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S:15: multiple definition of `_init'
    /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S:15: first defined here
    /tmp/cccQWNZJ.o: In function `powc':
    main.cpp:(.text+0x0): multiple definition of `powc'
    out:(.text+0xb4): first defined here
    /tmp/cccQWNZJ.o: In function `powref(int, int)':
    main.cpp:(.text+0x70): multiple definition of `powref(int, int)'
    out:(.text+0x124): first defined here
    /tmp/cccQWNZJ.o: In function `powretour(int, int, long double&)':
    main.cpp:(.text+0xde): multiple definition of `powretour(int, int, long double&)'
    out:(.text+0x192): first defined here
    /tmp/cccQWNZJ.o: In function `main':
    main.cpp:(.text+0x1a0): multiple definition of `main'
    out:(.text+0x254): first defined here
    /usr/lib/gcc/i486-linux-gnu/4.3.3/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
    out:(.dtors+0x4): first defined here
    /usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.
    /usr/bin/ld: error in out(.eh_frame); no .eh_frame_hdr table will be created.
    collect2: ld a retourné 1 code d'état d'exécution

    Pour info, voici mon fichier principal :

    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
     
    extern "C" {
    	#include "exo1.c"
    	}
    using namespace std;
     
    #include "powcpp.cpp"
    #include<iostream>
     
    int main(){
      int n,m;
      long double res,res2,res3;
      cout << "Entrez la valeur puis l'exposant :" << endl;
      cin >> n;
      cin >> m;
      res = powc(n,m);
      res2 = powref(n,m);
      powretour(n,m,res3);
      cout << "Resultat powc : " << res << endl << "Resultat powref : " << 
    	res2 <<endl << "Resultat powretour : " <<  res3 << endl;
      return 0;
    }

    et les deux autres

    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
    long double powc(int val, int exp) {
      long double res;
      double pas;
      int i;
     
      if (exp < 0){
        pas = (double)  1/val;
        exp = -exp;
      } else {
        pas = val;
      }
      res = 1;
      for (i=0;i<exp;i++) {
        res *= pas;
      }
      return res;
    }
    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
    long double &powref(int val, int exp) {
      static long double res;
      double pas;
      int i;
     
      if (exp < 0){
        pas = (double)  1/val;
        exp = -exp;
      } else {
        pas = val;
      }
      res = 1;
      for (i=0;i<exp;i++) {
        res *= pas;
      }
      return res;
    }
     
    void powretour(int val, int exp,long double &result) {
      double pas;
      int i;
     
      if (exp < 0){
        pas = (double)  1/val;
        exp = -exp;
      } else {
        pas = val;
      }
      result = 1;
      for (i=0;i<exp;i++) {
        result *= pas;
      }
    }

    Merci d'avance pour votre aide.

  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
    Ton code [] compile chez moi avec toutes les options activées il est vrai avec MinGW (gcc 4.4.0). Aurais-tu un problème d'installation du compilateur ?
    Question bête : ce sont des exercices de cours donnés par un prof ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Par défaut
    oui exo de cours mais codé par moi

    Je tente une réinstallation de g++...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La réponse est simple, et est, en partie, donnée par le message de la première erreur avec son "multiple definitions of <XXX>"

    on n'inclus jamais un fichier d'implémentation dans un autre, ce sont toujours les fichiers d'en-tête qu'il faut inclure.

    En effet, la directive include fonctionne, finalement, de manière assez basique: elle se contente de remplacer la directive par... le contenu du fichier à inclure.

    D'un autre coté, et pour te permettre de comprendre le problème, il existe une règle nommée "One Definition Rule", qui indique que, dans l'ensemble d'un projet, une seule et même fonction ne peut être définie qu'une seule et unique fois.

    Dés lors, si tu inclue un fichier d'implémentation dans un autre, les implémentations des fonctions se trouvant dans le fichier inclus se trouvera:
    • Dans le fichier objet du fichier inclus
    • Dans le fichier objet du fichier qui l'inclus.
    avec la conséquence "logique" de voir l'éditeur de lien se plaindre d'une définition multiple.

    Si tu veux "découper" efficacement un projet en plusieurs fichiers, il faut:
    1. déclarer les fonctions définir les structures et les types personnalisé dans un fichier d'en-tête (*.h / *.hpp)
    2. définir les fonctions et les variables globales (s'il y en a, ce qui n'est jamais conseillé) dans un fichier d'implémentation ( *.cpp)
    3. inclure les fichiers d'en-tête indépendamment dans d'autres fichiers d'en-têtes (en faisant attention aux inclusion circulaires) ou dans les fichiers d'implémentation de manière cohérente

    Tu retrouvera ces explications avec quelques détails supplémentaires sur la page de la FAQ qui traite de l'organisation du code

    Nota: il existe cependant une exception à cette règle lorsque l'on travaille avec des template, mais je présumes qu'il ne sert pas à grand chose de venir t'embrouiller l'esprit avec ce genre de détail...

    Fais moi signe si tu veux les avoir, ou fais carrément un petit détour vers la page de la FAQ qui traite des template
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Par défaut
    Ta raison cela paraît logique, étant habitué au java, je comprends les principes et j'aurai dû m'en rendre compte plus rapidement .

    Je vais donc faire une interface où seront indiquées les entêtes et spécifications de mes fonctions.

    Je suppose qu'il me faudra au moment de la compilation rajouter mes fichiers d'implémentation dans la ligne de commande.

    Merci pour l'aide

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -o -wall out main.cpp
    cette commande ne fait pas ce que tu penses
    -o sert a définir le fichier de sortie pour ce qui suit dans la ligne de commande
    définit donc le fichier de sortie pour etre "out"

    mais tu as insérer l'option -wall entre l'option est son argument
    -wall devient donc le fichier de sortie (ce qui n'est pas ce que tu voulais ) et out devient... un des fichiers sources, au meme titre que main.cpp

    et comme c'est un fichier executable, G++ va essayer de le linker avec main.cpp (qui est lui mmee un executable)

    sinon, ce qu'a dit koala est tres tres vrai aussi, meme si en fait ici tu avais réussi a apsser entre les gouttes.

  7. #7
    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
    Citation Envoyé par allezlolo Voir le message
    oui exo de cours mais codé par moi

    Je tente une réinstallation de g++...
    Pour commencer et éviter ces déboires, je te conseille de t'installer un I.D.E. Il en existe de gratuit pour toutes les plateformes. Fais un tour dans la page Outils & compilateur C++ pour t'aider à en choisir un.

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Je renverrais même à http://alp.developpez.com/tutoriels/debuter-cpp/ pour toutes sortes de conseils, ressources, etc.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Par défaut
    merci pour toutes ces infos.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2007, 13h36
  2. Erreur SQL ajout fichier MDF
    Par penchu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/03/2007, 16h55
  3. [syntaxe] Ajouter option dans une liste
    Par achos dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 27/02/2007, 19h28
  4. [AJAX] Liste avec si select "autre" ouvre un div pour ajouter option
    Par gandalf76fr dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/11/2006, 15h24
  5. [jspc] Erreur avec l'option verbose
    Par Shivan dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/05/2006, 11h02

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