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

VC++ .NET Discussion :

error LNK2001: symbole externe non résolu


Sujet :

VC++ .NET

  1. #1
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut error LNK2001: symbole externe non résolu
    Bonjour ;

    j'ai crée une bibliothèque sous visual c++


    ensuite j'ai crée un projet ou je voulais utiliser ma bibliothèque mais j'ai c'est deux erreurs :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VecteurLib.lib(VectLib.obj) : error LNK2001: symbole externe non résolu "public: static double VectLib::Vecteur::yval" (?yval@Vecteur@VectLib@@2NA)
    1>VecteurLib.lib(VectLib.obj) : error LNK2001: symbole externe non résolu "public: static double VectLib::Vecteur::xval" (?xval@Vecteur@VectLib@@2NA)
    j'ai révisé mon code plusieurs fois moi je ne vois pas ou est l'erreur .

    merci d'avance our votre aide .

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    tu dois ajouter une initialisation a tes membres static

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    double VectLib::Vecteur::xval = NULL;
    Fait le en dehors du header tu risque d'avoir des problème de double déclaration de ton static

  3. #3
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par jouana Voir le message
    Bonjour,

    tu dois ajouter une initialisation a tes membres static

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    double VectLib::Vecteur::xval = NULL;
    Fait le en dehors du header tu risque d'avoir des problème de double déclaration de ton static
    j'ai pas compris ou je dois rajouter ça exactement et pourquoi , merci .

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Logiquement tu dois faire un fichier header (.h) pour les déclaration
    et un fichier source (.cpp) pour l'implémentation de ta classe

    voici un exemple

    Fichier MaClass.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    class MaClasse
    {
    static int a;
    public:
        void maMethod();
    }
    Fichier source .MaClass.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #include "MaClass.h"
     
    int MaClasse::a = 0;
     
    void MaClasse::MaMethod()
    {
    /// impl.
    }
    Si tu n'as pas ces notions ça veut dire que tu commence dans ce langage je te conseil donc de faire des tuto
    Bonne journée

  5. #5
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    c'est vrai que je commence avec le c++ , mais pour la notion des classes cava , j'ai créé une bibliothèque statique , et j'ai met deux classe "point et vecteur" dans un namespace et je les ai déclaré dans le fichier .h , que j'ai collé dans ma question .

  6. #6
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    en plus c'est je rajoute #include "MaClass.h" dans le ficher .cpp , j'ai l'erreur redéfinir la classe

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Regardez plus attentivement le post jouana.
    "class XXX{...}" c'est à mettre uniquement dans le .h.

  8. #8
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Regardez plus attentivement le post jouana.
    "class XXX{...}" c'est à mettre uniquement dans le .h.
    d'après son poste faut le mettre en dehors du .h


    "Fait le en dehors du header tu risque d'avoir des problème de double déclaration de ton static " !

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Le c++ et un peu plus contraignant que le java ou le c#

    Le .h est un fichier de déclaration
    Le .cpp est un fichier d'implémentation

    En gros tu définit ta classe dans le .h et tu initialise la variable static dans le .cpp
    Et tu implémente les methodes dans le fichier .cpp

  10. #10
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par jouana Voir le message
    Le c++ et un peu plus contraignant que le java ou le c#

    Le .h est un fichier de déclaration
    Le .cpp est un fichier d'implémentation

    En gros tu définit ta classe dans le .h et tu initialise la variable static dans le .cpp
    Et tu implémente les methodes dans le fichier .cpp
    est ce que j'ai pas fait ça dans mon code ? j'ai mets les declarations dans .h et je les ai implémenté dans le .cpp
    est ce que c'est faut de mettre deux classes dans le namespace ?

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    >est ce que j'ai pas fait ça dans mon code ? j'ai mets les declarations dans .h et je les ai implémenté dans le .cpp

    NON, vous avez déclaré dans le .h et vous avez déclaré des fonctions "inlines" dans le .cpp
    Le format d'implémentation et bien différent du format de déclaration.

    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
     
    namespace VectLib
    {  
       class Point
       {
          public:
     
          double xVal, yVal; // x and y co-ordinates of Point. 
          void setCoords(double x, double  y){xVal = x; yVal = y;}
          double getX() {return xVal;}
          double getY() { return yVal;}   
       };
     
       class Vecteur 
       {
          public : 
             static double xval;
             static double yval; 
     
           double getx(void) ;
           double gety(void) ; 
     
    };
     
       Vecteur initialiser(double x  , double y );
       Vecteur initialiserAvecPoint (Point a , Point b);
       Point initialiserPoint (double x, double y);
       void afficher(Vecteur v) ; 
       double norme (Vecteur v);
       Vecteur additionner(Vecteur v1 ,Vecteur v2 );
       Vecteur soustraction (Vecteur v1 ,Vecteur v2 );
       double multiplication (Vecteur v1 ,Vecteur v2 );
    }
    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
     #include <iostream>
     
    using namespace std;
     
    namespace VectLib 
    {
     
       double Vecteur::xval = 0; 
       double Vecteur::yval= 0; 
       double Vecteur::getx(void) {return xval;}  
       double Vecteur::gety(void) {return yval;}  
     
       Point initialiserPoint (double  x, double y)
       { 
    ...
       }
    ...
    } //Fin du namespace
    >est ce que c'est faut de mettre deux classes dans le namespace ?
    SI, c'est autorisé et c'est une bonne pratique.

  12. #12
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    vous pensez que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      void setCoords(double x, double  y) {xVal = x; yVal = y;}
    est la cause de l'erreur.


    des fonctions "inlines" dans le .cpp ? pour chaque fonction j'ai prit son prototype et je je l'ai inseré dans le .h , est ce que vous pouvez m'éclaircir plus s'il vous plait .

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCoords(double x, double  y) {xVal = x; yVal = y;}
    Si setCoords est une méthode de Point, ceci est une déclaration et l'implémentation "inline" de la méthode, cela ne peut apparaît que dans un .h.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Point::setCoords(double x, double  y) {xVal = x; yVal = y;}
    Est une implémentation de la même méthode, et ne peut apparaît que dans un .cpp.

    "class XXX{...}" c'est à mettre uniquement dans le .h. (BIS)

  14. #14
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCoords(double x, double  y) {xVal = x; yVal = y;}
    Si setCoords est une méthode de Point, ceci est une déclaration et l'implémentation "inline" de la méthode, cela ne peut apparaît que dans un .h.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Point::setCoords(double x, double  y) {xVal = x; yVal = y;}
    Est une implémentation de la même méthode, et ne peut apparaît que dans un .cpp.

    "class XXX{...}" c'est à mettre uniquement dans le .h. (BIS)
    j'ai supprimé complètement cette fonction meme si c'est pas la causse du probléme voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : error LNK2001: symbole externe non résolu "public: static double VectLib::Vecteur::yval" (?yval@Vecteur@VectLib@@2NA)

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Vous n'avez toujours pas compris la différence entre une déclaration et une implémentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    namespace VectLib 
    {
     /*class Vecteur A NE SURTOUT PAS METTRE
        {*/
    ...
          double Vecteur::xval = 0; 
    ...
       }
    ...
    }

  16. #16
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    /*class Vecteur A NE SURTOUT PAS METTRE !!
    {*/

    commet ça je ne mets pas la classe dans le .h ou bien dans le .cpp dans le tuto y'avait toujours la classe dans le deux fichier .

    Voici mon dossier .h dites moi juste qu'est ce qu'il faut mettre ou pas

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    >commet ça je ne mets pas la classe dans le .h ou bien dans le .cpp
    Dans le CPP, le .h est "bon".

    >dans le tuto y'avait toujours la classe dans le deux fichier
    Quel tuto ?

  18. #18
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    j'ai enlevé les deux classes du .cpp il reconnu plus .cpp , j'ai rajouter #include <VectLib.h> dans le .cpp il la souligne en rouge il me dit impossible d'ouvrir le fichier source , sachant qu'ils ont de le meme dossier.

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    j'ai rajouter #include <VectLib.h>
    Vous ne connaissez pas encore la différence entre
    #include <VectLib.h>
    et
    #include "VectLib.h"
    .

  20. #20
    Membre régulier
    Profil pro
    Doctorant
    Inscrit en
    Février 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 258
    Points : 88
    Points
    88
    Par défaut
    merci bacelar merci jouana , dites moi juste est ce que il faut toujours initialiser les variables utilisées dans le fichier .cpp

Discussions similaires

  1. error LNK2019: symbole externe non résolu
    Par sheep_one dans le forum Windows
    Réponses: 0
    Dernier message: 03/06/2010, 11h03
  2. error LNK2019: symbole externe non résolu
    Par Halloula dans le forum Visual C++
    Réponses: 3
    Dernier message: 28/11/2009, 02h19
  3. error LNK2019: symbole externe non résolu
    Par bugmenot dans le forum Visual C++
    Réponses: 6
    Dernier message: 24/11/2009, 01h02
  4. error LNK2019: symbole externe non résolu "void __cdecl MaFonction
    Par lolo le belge dans le forum Visual C++
    Réponses: 3
    Dernier message: 30/10/2009, 11h38
  5. error LNK2001:sumbole externe non résolu
    Par mony84 dans le forum Bibliothèque standard
    Réponses: 7
    Dernier message: 27/08/2008, 17h17

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