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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    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.

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

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    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 confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Rhoooo, j'avions point vue....
    --
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    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.

+ 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