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 :

[Debutant] Erreur LNK2001 sous Visual.Net.


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut [Debutant] Erreur LNK2001 sous Visual.Net.
    Bonjour,

    Voila mon problème: Je fais une application Win32, un petit programme assez simple avec l'interface basique de Visual.

    Donc dans le premier fichier nommé cavitation.cpp

    (...)

    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
    int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
    {
     	// TODO: Place code here.
    	MSG msg;
    	HACCEL hAccelTable;
    	// Initialize global strings
    	Maillage A;
    	double Centrage = 0.5;
    	double a1 = 0.;
    	double b1 = 0.;
    	double c1 = 1.;
    	double a2 = 0.;
    	double b2 = 0.;
    	double c2 = 1.;
    	int Nx = 100;
    	int Ny = 100;
    	double Lamont = 1.;
    	double Laval = 1.;
    	double Ltuyere = 1.;	
                 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_CAVITATION, szWindowClass, MAX_LOADSTRING);
    (...)

    Donc ici j'initialise des variables que je veux globales i.e. que j'utilise dans d'autres .cpp de mon programme.

    J'associe a ce .cpp le header suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #pragma once
     
    extern int Nx,Ny;
    extern double a1,b1,c1;
    extern double a2,b2,c2,Centrage;
    extern double Lamont,Laval,Ltuyere;
    extern Maillage A;
    Avec comme nom cavitation.h

    La commande "extern" est celle que j'ai lue dans quelques forum pour déclarer les variables globales.

    Bon lors de la compilation j'obtient les messages suivant :

    Cavitation error LNK2001: unresolved external symbol "class Maillage A" (?A@@3VMaillage@@A)
    Et ainsi de suite pour toutes les variables.

    J'ai aussi l'erreur suivante :

    Cavitation error LNK2019: unresolved external symbol "public: __thiscall Maillage::Maillage(void)" (??0Maillage@@QAE@XZ) referenced in function _WinMain@16
    et:

    Cavitation error LNK2019: unresolved external symbol "public: virtual __thiscall Maillage::~Maillage(void)" (??1Maillage@@UAE@XZ) referenced in function _WinMain@16

    J'espere ne pas alourdir en ajoutant ma definition de la classe maillage :

    "Maillage.h"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #pragma once
     
    class Maillage {
    public:
    	Maillage(void);
    	virtual ~Maillage(void);
    public: 
    		double **PointMaillage;
    		void CreationPoint(int , int);
    		void Dessin();
    		void Zone1(int,int);
    		void InitParam(int, int);
    };
    et "Maillage.cpp"

    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
    34
    35
    36
    #pragma once
    #include "stdafx.h"
     
     
    void Maillage::InitParam(int A,int B)
    	{
    		int i;
    		int X,Y;
    		X = 3*A;
    		Y = 3*B;
    		PointMaillage = new double *[X];
    		for (i=0;i<X;i++)
    		{
    			PointMaillage[i] = new double [Y];
    		}
    	};
    void Maillage::Zone1(int X, int Y)
    	{ 
    		int i,j;
    		for (i=0;i<X;i++)
    		{
    			for (j=0;j<Y;j++)
    			{
    				PointMaillage[i][j]=1;
    			}
    		}
    	};
     
    void Maillage::CreationPoint(int A, int B) 
    	{
     
    	};
     
    void Maillage::Dessin()
    	{
    	};
    Je precise que "stdafx.h" regroupe tout les headers ...

    Je suis debutant alors je vous demanderais un peu de compassion. J'espere ne pas rompre une des lois du forums en postant comme je l'ai fait.

    Merci de votre compréhension.

    PS: une reponse en langage simple serait appréciable.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Je precise que j'ai fait ce post dans la categorie C/C++ car je ne pense pas que ce soit une erreur due au compilateur visual, mais bien une erreur de langage C++ de ma part.

  3. #3
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut définir les variables globales en dehors de toute fonction. Si tu le fais dans ton main, elles auront une portée limitée à cette fonction.

    A part ça, un #pragma once dans un .cpp ce n'est pas correct, même si ça n'a pas beaucoup de conséquence

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour tes deux dernières erreurs : tu as déclaré un constructeur et un destructeur pour ta classe, mais tu ne les as pas définis.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Les variables "globales" sont en fat définies dans WinMain, elle ne sont pas visibles de l'extérieur, même avec un extern qui en fait dit qu'il existe des variables globales de ce nom. Mais c'est très très très très très très sale de fonctionner ainsi.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos reponses.

    Donc comment faire pour bien declarer les globales? dans un .cpp a part?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Voila j'ai trouvé la solution :

    Je repete peut-etre des choses qui sont deja sur le forum :

    Mais bon :

    J'ai fait un fichier .h avec :

    extern type variable

    Et un fichier .cpp avec :

    type variable = valeur

    Ensuite dans mon fichier qui regroupe les headers (stdafx.h) j'ai ajouté ce .h . Comme ca des que j'ai besoin des globales elles sont la quand j'inclus "stdafx.h"

    Merci pour tout.

    Juste une confirmation que c'est pas trop risqué ni problematique en quoi que ce soit serait bien venu ...

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est sale, c'est pas propre comme design, pas trop extensible, il y a des risques de conflit entre les noms des variables dans tes fonctions - surtout avec des noms aussi explicites - mais à part ça, ça va !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    Une solution peut-etre alors?
    J'ai bien ri sur ton message en tout cas

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 2
    Points
    2
    Par défaut
    J'ai vu des trucs avec des #if et #endif mais alors ca m'est compètement incompréhensible, et à lire les commentaire d'en dessous, c'était pas non plus la joie et la propreté mir...

Discussions similaires

  1. Erreur ODBC sous visual c++
    Par thierryG dans le forum C++
    Réponses: 1
    Dernier message: 11/07/2008, 16h52
  2. classwizar sous visual .net 2005?
    Par toutounesan dans le forum Visual C++
    Réponses: 1
    Dernier message: 06/10/2007, 17h19
  3. Comment eteindre un PC en C++ sous Visual.NET ?
    Par PONSOLLE dans le forum MFC
    Réponses: 2
    Dernier message: 01/09/2005, 22h19
  4. debutant: erreur LNK2001 avec la librairie GSL
    Par drill3 dans le forum MFC
    Réponses: 6
    Dernier message: 25/04/2005, 13h58
  5. Réponses: 3
    Dernier message: 17/02/2005, 08h37

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