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 :

LNK2019 et LNK1120


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut LNK2019 et LNK1120
    Bonjour

    Mon programme marche très bien à la compilation mais à l'exécution j'ai les messages d'erreur suivants :

    1>main.obj : error LNK2019: symbole externe non résolu "public: __thiscall datets::TimeSeries<double>::TimeSeries<double>(int)" (??0?$TimeSeries@N@datets@@QAE@H@Z) référencé dans la fonction _main
    1>C:\Users\Valoche\Desktop\ProjetBis\ProjetBis\Debug\Projet.exe : fatal error LNK1120: 1 externes non résolus

    J'ai cherché sur internet et j'ai cru comprendre que c'était un problème de librairie. J'ai inclus tous ce que je pouvais (ne sachant pas très bien ce qu'est une librairie), mais je n'arrive pas à régler le problème.

    Voici mon main.cpp :
    [ajouté par mongaulois]
    Code C++ : 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
    #include "Stdafx.h"
    #include "TimeSeries.h"
    #include "Date.h"
    #include "stdlib.h"
    #include <iostream>
    #include <map>
     
    using namespace datets;
     
    int main() {
    	Date d1(15,12,2007);
    	std :: cout << d1;
    	Date d2(24,8,2009);
    	TimeSeries<double> ts1(2);
    	//ts1.ajouter(d1, 3);
    	//ts1.ajouter(d2, 4);
    	//ts1.afficher();
     
    }

    J'ai une classe Date et une classe TimeSeries définies à côté. La classe TimeSeries est une classe générique contenant un map.

    Quelqu'un peut-il m'aider ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    Déjà

    Sinon, compile tu ton code???
    Lors du link, il ne trouve pas
    datets::TimeSeries<double>::TimeSeries<double>(int).

    Tu dit que cette class est générique. Tu veut dire template??
    peut tu mettre son .h??

  3. #3
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    Je me demande si l'étape d'édition de lien s'est produite, sinon peut être te manque-t'il une libraire dynamique (dll sous windows ou so sous *nix) dans le répertoire d'exécution, ou dans le LD_LIBRARY_PATH ou PATH (selon ton système).
    Vu qu'il semble que ce soit un fichier à toi, je pencherai pour la première solution.

    /!\ Les implémentations des class templates ne doivent pas se trouver dans un .cpp que tu compile, tu dois les écrire dans des fichiers que tu inclues dans ton code source (avec #include).

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    /!\ <= jolie

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    Je m'excuse, je suis plus que très débutante en C++, et je n'ai pas tout compris dans les réponses ...

    Voici mon fichier TimeSeries.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
    #ifndef _TIMESERIES_H
    #define _TIMESERIES_H
    #include "Date.h"
    #include <map>
    #include "stdlib.h"
     
    namespace datets {
     
    	template <class G> class TimeSeries {
    		int n;
    		std :: map <Date, G> liste;
     
    	public :
     
    		TimeSeries (int);
     
    		void ajouter (Date, G); //méthode qui ajoute une valeur au map
     
    		void afficher ();
     
    		TimeSeries intersect (TimeSeries, TimeSeries);
     
    	};
     
    }
    #endif
    Pour l'implémentation de ma classe template (donc TimeSeries) je l'ai effectivement aitdasn un fichier .cpp, car c'est ce qui est demandé dans mon projet (séparer implémentation et déclaration).

  6. #6
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    J'avais donc vu juste. Il m'est arrivé aussi de faire ce genre d'erreur à mes débuts dans la manipulation des class template..
    En fait, l'implémentation de ta classe TimeSeries ne doit pas être compilée telle quelle puisqu'elle est une classe template (il lui faut un parametre qui sera le type qui remplacera ton type G, double, en l'occurrence dans ton programme principal).
    Si tu tien absolument à séparer l'implémentation de la définition tu peux faire quelque chose de cette manière:
    "TimeSeries.h" reste le même:
    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
    #include <iostream>
    #ifndef _TIMESERIES_H
    #define _TIMESERIES_H
    #include "Date.h"
    #include <map>
    #include "stdlib.h"
     
    namespace datets {
     
    template <class G> class TimeSeries {
        int n;
        std :: map <Date, G> liste;
     
      public :
     
        TimeSeries (int);
     
        void ajouter (Date, G); //méthode qui ajoute une valeur au map
     
        void afficher ();
     
        TimeSeries intersect (TimeSeries, TimeSeries);
     
      };
     
    }
    #endif
    - Création d'un fichier "TimeSeries.inl" (qui remplacera ton fichier.cpp, en fait tu peux simplement te contenter de le renommer.)

    Remplacement de l'inclusion de "TimeSeries.h", par "TimeSeries.inl" dans la source de ton programme principal:
    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
    #include "Stdafx.h"
    #include "TimeSeries.inl"
    #include "Date.h"
    #include "stdlib.h"
    #include <iostream>
    #include <map>
     
    using namespace datets;
     
    int main() {
    	Date d1(15,12,2007);
    	std :: cout << d1;
    	Date d2(24,8,2009);
    	TimeSeries<double> ts1(2);
    	//ts1.ajouter(d1, 3);
    	//ts1.ajouter(d2, 4);
    	//ts1.afficher();
     
    }
    Essayes ça, normalement ça devrait suffir. Bon courrage pour le reste .
    Cette partie de la FAQ C++, explique le fonctionnement des templates en C++, ce qui se passe à la compilation (en particulier le premier article).

    PS: N'oublies pas la balise "Code" (c'est le # au dans la barre d'outil de ton éditeur).

    PS @ Mongaulois: Merci!

  7. #7
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    J'ai relu ton message, et je m'aperçois, qu'on n'a pas répondu à ta questions sur les librairies.
    Une librairie ce n'est pas simplement le .h (ou .hpp, .hxx, etc.). En simplifiant un peu (beaucoup?) on peut dire que ces fichiers servent à décrire ce qui est contenu dans:
    1. Un code source (.C, .cpp, .cxx, etc.)
    2. Des fichiers Objet (.o, ou .obj, selon les compilateurs)
    3. Une librairie (.a ou .lib)

    Comme on a du te le dire, la compilation (d'un exécutable du moins) en C ou C++ se déroule en 3 grandes étapes:
    1. Appel du préprocesseur (qui se charge de modifier ton code source en fonction des directives que tu lui as donné: #include, #ifdef, etc.)
    2. La compilation proprement dite (transformation du code source en code machine), c'est là ici, que sont créés les fichiers .o ou .obj.
    3. Edition de lien (mise en relation des morceaux de code source résultant de l'étape 2)

    Il en résulte un fichier exécutable, si les trois étapes se sont bien passées.

    (tien je n'ai pas trouvé de sujet la dessus, dans la FAQ, l'ai-je raté, ou n'est il pas traité?)

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

Discussions similaires

  1. VC++2008: Erreur compilation/linkage LNK2019 LNK1120
    Par grodwar dans le forum Visual C++
    Réponses: 2
    Dernier message: 16/07/2012, 13h57
  2. Réponses: 1
    Dernier message: 30/06/2011, 11h26
  3. visual c++: error LNK2019 et fatal error LNK1120
    Par moimoi_1 dans le forum MFC
    Réponses: 2
    Dernier message: 05/11/2005, 07h41
  4. pb link LNK1120
    Par foxewizardeur dans le forum C++
    Réponses: 4
    Dernier message: 19/02/2005, 20h22
  5. Réponses: 4
    Dernier message: 23/04/2004, 16h06

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