Linkerfehler LNK2001 Nichtaufgelöstes externes Symbol



  • Hallo,
    ich arbeite mit VC6 und möchte aus zwei verschiedenen Klassen/Dateien auf eine Klasse zugreifen. Hierzu habe ich eine Klasse mit einer Rückgabefunktion geschrieben. Die Funktion rufe ich aus meinen anderen Klassen auf mit:

    CSuchliste *SuList=CSuchliste::getP();
    

    die des Headers der Klasse CSuchliste lautet wie folgt:

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // Suchliste1.h : Header-Datei
    //
    
    /////////////////////////////////////////////////////////////////////////////
    // Dokument CSuchliste 
    #ifndef SUCH_LISTE_H
    #define SUCH_LISTE_H
    
    class CSuchliste 
    {
    private:
    static CSuchliste *m_pP;
    
    public:
    char cSuchWortListe[50][50];
    
    CSuchliste();
    ~CSuchliste(){};
    
    static CSuchliste *getP()
    {
    	if(!m_pP){
    		m_pP=new CSuchliste();
    	}
    	return m_pP;
    };
    
    } ;
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    #endif
    

    der Fehlercode lautet wie folgt:

    Linker-Vorgang läuft...
    Feeder.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class CSuchliste * CSuchliste::m_pP" (?m_pP@CSuchliste@@0PAV1@A)
    RSSFeeder.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class CSuchliste * CSuchliste::m_pP" (?m_pP@CSuchliste@@0PAV1@A)
    Debug/RSSFeeder.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    Ich weiß zwar ungefähr was mir die Meldung sagen soll, aber nach meinem Verständnis hätte m_pP in der Klasse gekapselt sein sollen und von außerhalb hätte gar kein Zugriff vorgenommen werden dürfen. In meinem Aufruf kommt es ja auch nicht vor. Als kann mE nur beim Aufruf des Header durch meine Feeder.cpp Datei das Symbol angelegt worden sein und nun kann er es beim Linken nicht mehr finden.
    Was kann ich nun aber machen, um dieses Problem zu beheben, entweder stehe ich auf dem Schlauch oder ich habe da etwas nicht gerafft.
    Danke für Unterstützung
    Uwe



  • Du musst in der cpp-Datei nocj ein

    CSuchliste *CSuchliste::m_pP;
    

    einfügen...



  • Jochen Kalmbach schrieb:

    Du musst in der cpp-Datei nocj ein

    CSuchliste *CSuchliste::m_pP;
    

    einfügen...

    Dann bekomme ich einen Compilerfehler:

    D:\Projekte\Programmierung\C-Programme\MyProjects\RSSFeeder\RSSFeeder.cpp(180) : error C2655: 'm_pP' : Definition oder Neudeklaration im aktuellen Gueltigkeitsbereich unzulaessig
    d:\projekte\programmierung\c-programme\myprojects\rssfeeder\suchliste1.h(18) : Siehe Deklaration von 'm_pP'

    was ich auch verstehen kann, denn definiert ist er ja wohl durch das Einbinden des Headers?! 😕

    Hierdurch bin ich jedoch auf eine Lösung gestoßen: 🕶

    static CSuchliste *getP()
    {
    	static CSuchliste *m_pP;
    	if(!m_pP){
    		m_pP=new CSuchliste();
    	}
    	return m_pP;
    };
    

    Definition direkt in der Funktion, ganz lokal, läßt die externen Klassen nicht mehr den Pointer definieren (ich hätte gedacht, dass private: dies auch machen soll). 😃


Anmelden zum Antworten