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 :

Problème de référencement de .h avec g++


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut Problème de référencement de .h avec g++
    Bonsoir,

    J'ai un main.cpp que voici :
    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
    // MANAGER.cpp*: définit le point d'entrée pour l'application console.
    //
    #include "Interface_File.h"
     
    void Init();
     
     
    Interface_File *IntFile;
     
    void Init()
    {
    	IntFile = new Interface_File();
    }
     
    int main(int argc)
    {
    	Init();
    	return 0;
    }
    rien de très compliqué, normal je l'ai simplifié à l'extrème pour tester mon problème.

    et un le fichier Interface_File.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
    #pragma once
    #include "Parser.h"
     
    class Interface_File
    {
    public:
    	Interface_File(void);
    	~Interface_File(void);
     
    	char* GetData();
    	int SetData(char* source, entity e);
    	void SendData(char *dest, int sessionID);
     
    	Parser *parser;
     
    private:
    	char* data;
    };
    Bon je ne vous met pas le Parser.h car il inclus également d'autre .h et inutile de surcharger le sujet.

    En compilant sous Fedora 8 avec g++ j'ai une erreur de référencement de Interface_File au niveau de la ligne IntFile = new Interface_File();

    Sous visula studio (à la base c un projet visual), avec l'entête pré-compilé dans le main.cpp (#include "stdafx.h") tout se passe très bien.

    Lorsque je regarde le stdafx.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
    // stdafx.h*: fichier Include pour les fichiers Include système standard,
    // ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment,
    // et sont rarement modifiés
    //
     
    #pragma once
     
    #include "targetver.h"
     
    #include <stdio.h>
    #include <tchar.h>
     
     
     
    // TODO*: faites référence ici aux en-têtes supplémentaires nécessaires au programme
    et "targetver.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #pragma once
     
    // Les macros suivantes définissent la plateforme minimale requise. La plateforme minimale requise
    // est la version de Windows, Internet Explorer etc. qui dispose des fonctionnalités nécessaires pour exécuter 
    // votre application. Les macros fonctionnent en activant toutes les fonctionnalités disponibles sur les versions de la plateforme jusqu'à la 
    // version spécifiée.
     
    // Modifiez les définitions suivantes si vous devez cibler une plateforme avant celles spécifiées ci-dessous.
    // Reportez-vous à MSDN pour obtenir les dernières informations sur les valeurs correspondantes pour les différentes plateformes.
    #ifndef _WIN32_WINNT            // Spécifie que la plateforme minimale requise est Windows Vista.
    #define _WIN32_WINNT 0x0600     // Attribuez la valeur appropriée à cet élément pour cibler d'autres versions de Windows.
    #endif
    Je ne vois rien d'indispensable que je n'ai pas reprécisé dans mon manager.cpp !!!

    Bref je suis un peu perdu, pkoi g++ m'embêtes sous Fedora 8 alors qu'il ne m'embête pas sous Visual Studio ?

    Merci par avance pour votre aide.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Peux tu fournir l'erreur exact pour plus d'infos ?
    Je pense à la casse des fichiers par exemple...
    --
    Jérémie
    Jérémie

  3. #3
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    J'ai survolé rapidement, mais je suis à peu près sûr que c'est le #pragma once qui coince. Ceci n'est pas standard, ce qui explique pourquoi ton code compile avec VC++ et pas GCC (ce qui est généralement symptomatique d'un code non-portable).

    Utilise des include-guards classiques à la place des #pragma.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Rhoooo, j'avions point vue....
    --
    Jérémie
    Jérémie

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    merci pour vos réponses.

    J'y ai pensé aussi, j'ai enlevé les pragma once, mais rien n'y fait, toujours la même erreur :
    manager.cpp:12: undefined reference to Interface_File::Interface_File()

    je ne comprends pas

    Edit :
    en mettant tout dans le même fichier main sans include, j'ai le même problème
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  6. #6
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Effectivement, c'est bien plus clair avec l'erreur

    Le compilateur (ou plutôt l'éditeur de liens) te dit qu'il ne trouve pas la définition de Interface_File::Interface_File().
    En effet, où est-elle ? Tu devrais avoir un Interface_File.cpp, non ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    en fait je viens de comprendre le problème, le compilateur n'arrive pas à faire le lien entre Interface_File.h et Interface_File.cpp.

    Ces deux fichiers sont présent dans le même répertoire avec le manager.cpp (mon main)
    J'include Interface_File.h dans le main et dans Interface_File.cpp

    Mais il n'arrive pas à faire le lien, pourtant j'ai bien fait dans le cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Interface_File::Interface_File(void)
    {
    }
     
    Interface_File::~Interface_File(void)
    {
    }
    et ma commande de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -g -o manager manager.cpp
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Problème de compilation séparée. Il faut trois commandes:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -g -c manager.cpp
    g++ -g -c Interface_File.cpp
    g++ -g -o manager manager.o Interface_File.o
    Ou une seule, si tu ne sépares pas les étapes de compilation et édition de liens:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -g -o manager manager.cpp Interface_File.cpp
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Voilà

    Et ne t'en fais pas, le compilateur fait bien le lien entre les .h et .cpp, puisque c'est le préprocesseur qui s'occupe de remplacer les #includes par le contenu du fichier inclus.
    En fait, le compilateur lui-même (si on le différencie du préprocesseur qui intervient avant et de l'éditeur de liens qui intervient après) n'a pas à avoir connaissance des .h.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    ok merci pour vos réponses.
    Je commençais à me dire que mes faible connaissance en compilation et édition de liens me jouais des tours.
    C'était bien le cas.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/07/2008, 16h45
  2. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 15h35
  3. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17
  4. Réponses: 3
    Dernier message: 18/11/2002, 16h36
  5. Réponses: 1
    Dernier message: 27/05/2002, 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