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

Visual C++ Discussion :

Double référence à cause des fichiers dans le solution explorer


Sujet :

Visual C++

  1. #1
    Membre à l'essai Avatar de myflash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 59
    Points : 19
    Points
    19
    Par défaut Double référence à cause des fichiers dans le solution explorer
    j'ai cette erreur quand je compile avec Visual Studio 2005...

    Error 1 error LNK2005: "public: __thiscall abc::abc(void)" (??0abc@@QAE@XZ) already defined in Main.obj abc.obj

    je sais le problème mais je sais pas comment régler ça ...

    le problème est que Visual Studio compile les fichier qui sont dans le solution explorer avant de commencer a compiler mon main ... donc tous les include que je mets dans le ficher main.cpp ca me dit double définition, à cause qu'il se trouve à compiler 2 fois les fichiers même si j'ai des #pragma once au début de chaque fichier...

    je veux garder les fichier dans la liste du solution explorer pour pouvoir cliquer dessus pour les ouvrir et je veux pouvoir mettre mes include aussi pour garder les références des dépendances des class localement dans les fichier .cpp et .h....

    bref ma solution serait de pouvoir dire à Visual Studio de jamais compiler les fichiers dans le solution explorer...

    Quelqu'un sait comment ????

    Merci a l'avance !


    ps: j'ai mis un screenshot en attach...
    Images attachées Images attachées  

  2. #2
    Membre à l'essai Avatar de myflash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 59
    Points : 19
    Points
    19
    Par défaut
    on dirrait vraiment que le solution explorer prend pas compte du pragma once ... j'ai essayer aussi avec un define et ca ne marche pas plus... il dit deja definie dans main.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 566
    Points : 7 652
    Points
    7 652
    Par défaut
    Bonjour,

    On ne doit faire l'include que de fichiers .H. Et ces fichiers ne doivent pas contenir de définitions de variables ni de fonctions. Le #pragma once permet alors de ne pas avoir des types définis plusieurs fois.

    En aucun cas, on ne doit faire l'include d'un fichier .C
    En aucun cas on ne doit faire l'include de fichiers qui contiennent des définitions de variables ou de fonction.
    En aucun cas, #pagma once n'empêchera une redéfinition d'une variable ou d'une fonction.

  4. #4
    Membre à l'essai Avatar de myflash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 59
    Points : 19
    Points
    19
    Par défaut
    mais c'est anti convention de scope ca !!! si je fait une class je declare ma class dans le .h et programme les fonction dans le cpp...

    donc pour que le reste du programme vois tout on est suposer inclure le .h et le .cpp ou limite include le cpp et le cpp lui inclut le .h,

    comment le programme est suposer voir le code de la fonction si le cpp est pas inclut nullpart ?!?!?!

    y dois avoir un option pour ca dans visual studio... sinon il faut avoir un option pour ca... je sais pas genre "Precompile solution included cpp file"....

    a ce que je sache, visual studio est le seul compilateur qui fait ca.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 566
    Points : 7 652
    Points
    7 652
    Par défaut
    Si tu as plusieurs fichiers qui contiennent du code, ce sont des unités de compilation distinctes.
    Il faut mettre les fichiers dans ton projet pour qu'ils soient tous compilés et liés. Sous Visual Studio, tu cliques sur ton projet avec le bouton droit et choisis "add existing items..."
    Nom : visual_example.png
Affichages : 394
Taille : 32,5 Ko
    La liste des fichiers doit correspondre à tous le fichiers CPP tu veux compiler.
    Pour que les fichiers CPP puissent se comprendre, il faut mettre dans un fichier .H les déclarations. Et c'est de ce fichier .H que tes 2 fichiers CPP doivent faire l'include.

  6. #6
    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
    Citation Envoyé par myflash Voir le message
    donc pour que le reste du programme vois tout on est suposer inclure le .h et le .cpp ou limite include le cpp et le cpp lui inclut le .h,
    FAUX. Tu es censé inclure le .h pour lui dire que la fonction existe. Trouver son contenu, le compilateur s'en moque, c'est le boulot de l'éditeur de liens.

    comment le programme est suposer voir le code de la fonction si le cpp est pas inclut nullpart ?!?!?!
    Les deux .cpp sont dans le même projet, donc les fruits de leurs compilations seront tous les deux passés en ligne de commande de l'éditeur de liens.

    Pour les histoires de "precompiled", le mieux est de désactiver tout ça quand on débute. Ça cause plus de confusion qu'autre chose.


    En fait, j'ai l'impression qu'il te manque la connaissance des principes de base du processus par lequel un ou plusieurs fichiers source C ou C++ donnent un exécutable.
    L'information qui te manque, c'est que pour ces langages c'est fait en deux étapes:
    1. La compilation concerne un fichier source à la fois. Elle transforme le code source C ou C++ en un fichier appelé "code objet", constitué de petits bouts de code exécutable (un morceau par fonction, par exemple). Ces fichiers ne peuvent être utilisés directement parce qu'ils n'ont pas la structure d'un exécutable et font références aux fonctions de la bibliothèque standard sans les contenir).
      • Sous Visual Studio, les fichiers objets ont l'extension .obj. Sous GCC, ils ont l'extension .o.
    2. L'édition de liens rassemble les différents fichiers objets, ainsi que les morceaux des bibliothèques dont ils dépendent, pour en faire un exécutable.
      • C'est un poil plus compliqué pour les bibliothèques parce qu'il y en a deux sortes, mais c'est le principe de base.


    Donc en gros, tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main.cpp  abc.cpp
        |        |
    main.obj  abc.obj   libc.lib
        \       /          /
         dddd.exe
    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.

Discussions similaires

  1. Double JFrame et enregistrer des String dans un fichier .txt
    Par Onelove dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/08/2014, 11h46
  2. [3D'S MAX] importer des fichiers dans OpenGL
    Par black is beautiful dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/04/2005, 13h45
  3. Réponses: 9
    Dernier message: 05/04/2005, 09h39
  4. Chemin d'accès des fichiers dans des sous rep
    Par Le Veilleur dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/11/2004, 14h37
  5. [] [Réseau] Renommer des fichiers dans un site FTP
    Par JerBi dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 22/08/2003, 00h35

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