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++Builder Discussion :

Problème lors du "linking..."


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut Problème lors du "linking..."
    Bonjour

    J'ai un problème lors de la compilation sous C++ Builder 6 que je n'arrive pas à résoudre.
    [Linker Error] Unresolved external 'ColorTransparent(unsigned int, unsigned int, unsigned char)' referenced from D:\MES DOCUMENTS\PROGRAMMATION\SPACE KONKEST 2005\LUEUR\LUEUR.OBJ
    J'ai en fait deux fonctions dans "Transparence.cpp" et leurs prototypes dans "Transparence.h"
    Quand dans mon projet j'include "Transparence.h" (#include "Transparence.h"), cela engendre l'erreur ci-dessus. Pourquoi ?


    Sinon, si j'inclue le Transparence.cpp, ca ne bug plus...

    Merci

  2. #2
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    As-tu jeté un oeil dans la FAQ, au chapitre compilation ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    Salut

    Je viens de vérifier si mon fichier "Transparence" était inclut dans mon projet, et c'est le cas. Seulement, l'erreur apparait toujours (même en ayant supprimé tous les .obj).

    Projet:
    • Project1.res
      Project1.cpp
      Unit1.cpp
      Lueur.cpp
      Transparence.cpp




    dans Unit1.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "Unit1.h"
    #include "Lueur.h"
    Dans Lueur.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "Lueur.h"
    #include "Transparence.h"
    Dans Transparence.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Transparence.h"
    Lorsque j'inclue Transparence.cpp (au lieu de Tranparence.h) dans Lueur.cpp, l'erreur ne se produit plus, pourquoi alors je ne peux pas inclure le .h au lieu du .cpp ?

    Merci

  4. #4
    Invité de passage
    Inscrit en
    Août 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1
    Par défaut
    Est-ce que dans le source du projet (Project1.cpp) tu as bien le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "Transparence.h"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    A quoi cela sert-il d'inclure "Transparence.h" dans Project1.cpp alors que Project1.cpp n'utilise pas Transparence.h ?
    Seul Unit1.cpp utilise Lueur.h, et seul Lueur.h utilise Transparence.h

    :

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !
    Il vaut peut-être mieux faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "Transparence.h"  
    #include "Lueur.h" 
    #include "Unit1.h"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "Transparence.h" 
    #include "Lueur.h"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Transparence.h"
    Lors de la compilation de Unit1, si Lueur.h utilise des éléments de Transparence.h
    alors il faut que ces éléments soient connus, donc en incluant Transparence.h.

    A plus !

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    L'erreur de lien ne peut venir des include mal placés. Une telle erreur serait signalée à la compilation pas à l'édition de lien. Peut être vérifier la conformité des prototypes dans Transparence.h avec la définition des fonctions dans Transparence.cpp

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Par défaut
    oui, l'oubli d'un void dans la déclaration d'une fonction dans un .h , alors que la fonction est définie avec dans le .cpp entraîne ce genre d'erreur du lieur (car si ya pas de type de retour déclaré, le compilateur comprend int)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    Bonjour

    Ca y est, le problème a été résolu

    Mes fonctions (contenues dans Transparence.h/cpp) était des fonctions inline. Leurs prototypes étaient dans Transparence.h et leurs définitions dans Transparence.cpp. J'ai supprimé le .cpp et j'ai tout mis dans le .h avec le mot clé inline, et désormais, ca marche.

    [Linker Error] Unresolved external 'ColorTransparent(unsigned int, unsigned int, unsigned char)' referenced from D:\MES DOCUMENTS\PROGRAMMATION\SPACE KONKEST 2005\LUEUR\LUEUR.OBJ
    Cette erreur était donc du au mot clé inline.

    Merci pour toutes ces réponses

  10. #10
    Membre chevronné Avatar de BigBenQ
    Inscrit en
    Juillet 2005
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 363
    Par défaut

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    j'attendais une réflexion à propos de la réponse au problème avant de marquer résolu. pourquoi le compilateur ne sait pas lier des fonctions inline quand elles sont définies dans un fichier .cpp ?

    voila

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Parce que pour faire fonctionner l'inlining (ie. pour remplacer l'appel de fonction par son contenu), le compilo doit avoir accès à son corps. Or s'il est confiné dans une unité de traduction (.cpp) il n'y a pas accès. Même combat que les templates et les macros.

  13. #13
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Un fonction inline n'a plus de fonction que le nom. Le compilateur doit avori accès à son contenu au moment où il doit remplacer son appel. La règle qui en découle est qu'une fonction inline se définit dans le header, et pas dans le cpp.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    je vois, cependant les fichiers headers ne sont pas censer contenir que les prototypes des fonctions et pas de codes ? ainsi quel est l'utilité d'un header et d'un .cpp ?
    (je crois que cela ne relève plus de BCB)

    merci

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Un en-tête doit effectivement contenir uniquement des déclarations, mais on peut ajouter à cela "tout code ne devant pas être compilé". Ce qui est le cas des templates et des fonctions inline, par exemple. Il s'agit de toute façon d'une limitation technique, une fonction cloitrée dans un .cpp est compilée une fois pour toute et son code n'est plus disponible pour le reste du projet.

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

Discussions similaires

  1. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 11h47

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