unresolved external error



  • Hallo zusammen,

    ich bin ein Neuling in der Borland C++ Programmierung und suche deshalb jemanden der mir helfen kann mein Problem zu lösen, was wahrscheinlich kein großes ist, für jemanden ders kann.

    Ich habe ein Programm in MVC++ mit Kommandozeileneingabe zum Clustering (Datamining) geschrieben, das funktioniert. Nun will ich das ganze im BC++ Builder noch mit einem GUI ausstatten. Bis jetzt habe ich die Klassen in mein Projekt hinzugefügt und die nötigen includes gemacht. Dann habe ich versucht eine Variable einer anderen Klasse zu deklarieren, was auch funktioniert hat, jedoch bringt der Compiler immer die Fehler "unresolved external" auf Konstruktor, Destruktor und einige Methoden der Klasse. Ich hoffe, wenn ich den Code beifüge, dass mir jemand helfen kann.

    Die Header Datei des MainFrame:

    //---------------------------------------------------------------------------
    
    #ifndef MainframeH
    #define MainframeH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    
    #include "ReadFromFile.h"
    #include "lmf_db.h"        //hier binde ich die Klasse ein
    //---------------------------------------------------------------------------
    class TMain : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *CreateDBButton;
            void __fastcall CreateDBButtonClick(TObject *Sender);
            void __fastcall FormCreate(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            static lmf_db* array;    //hier ist die Variable der Klasse
            static int allFeat, cols, rows, levels, features, valInFeat;
    	static bool exit;
    	static bool existDB;
    	static AnsiString projectName;
            __fastcall TMain(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TMain *Main;
    //---------------------------------------------------------------------------
    #endif
    

    In der nächsten Form möchte ich das Array füllen.

    #include <vcl.h>
    #pragma hdrstop
    
    #include "ReadFromFile.h"
    #include "Mainframe.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TCreateDB *CreateDB;
    // ...
    void __fastcall TCreateDB::readFileClick(TObject *Sender)
    {
    //...
    // Hier möchte ich das Array im Mainframe erzeugen und mit Daten füllen
    TMain::array = new lmf_db(TMain::levels, TMain::valInFeat, TMain::features);
    
    //...
    }
    

    Als Fehler vom Compiler bekomme ich dann:
    [Linker Fehler] Unresolved external 'lmf_db::~lmf_db()' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\MAINFRAME.OBJ
    [Linker Fehler] Unresolved external 'lmf_db::lmf_db(int, int, int)' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\MAINFRAME.OBJ
    [Linker Fehler] Unresolved external 'TMain::array' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\MAINFRAME.OBJ

    Ich hab schon ziemlich viel Sachen probiert und hoffe nun, dass mir jemand von euch weiterhelfen kann. Das passiert nicht nur mit dieser Klasse, also muss ich irgendwo einen elemetaren Fehler haben.

    Vielen Dank,
    Mattias



  • Hi,

    Bis jetzt habe ich die Klassen in mein Projekt hinzugefügt und die nötigen includes gemacht.

    In einer Header stehen normalerweise alle Deklarationen von Klassen und Funktionen. Die Implementierung dieser Klassen und Funktionen erfolg normalerweise in der *.cpp- Datei.
    In anderen Fällen ist die Implementierung in einer *.lib oder in einer *.dll durchgeführt.

    Wenn du die Dateien so aufgeteilt hast ist ja alles in Ordnung.

    Nun bindest du die Header in dein Projekt ein. Damit ist die Deklaration der Klassen und Funktionen bekannt. Der Compiler schert sich aber ein Dreck darum, ob es die Implementierung der Klassen und Funktionen gibt. Er schaut also nicht einmal nach ob er die Implementierung findet.

    Dann habe ich versucht eine Variable einer anderen Klasse zu deklarieren, was auch funktioniert hat, jedoch bringt der Compiler immer die Fehler "unresolved external" auf Konstruktor,

    NEIN, eben nicht. Dem Compiler ist das Schnutz piep egal. Wenn das Projekt Compiliert ist (was er auch fehlerfrei machen wird) wird der Linker angeschmissen. Der Linker sucht nach der Implementierung der Klassen und wird scheitern. Daraufhin meldet der Linker diesen Fehler.

    Fazit: Der Linker kann die Implementierung nicht finden. Bedeutet, dass keine *.cpp, *.lib oder *.dll dem Projekt hinzugefügt wurde, die diese Implementierung enthält.



  • oder einfacher gesagt:

    Menü/Projekt/Dem Projekt hinzufügen/EigeneKlasse.cpp
    epidemic



  • ich wollte eigentlich, dass er auch versteht warum es so ist...



  • Danke für die Hilfe, ich habe (fast) alle Dateien zuvor schon dem Projekt hinzugefügt, bei der letzten habe ich nicht mehr auf Prjekt speichern gedrückt, die letzte .cpp-Datei wurde dann wieder aus dem Projekt geworfen, komisch. Aber jetzt funktionierts. Danke.


Anmelden zum Antworten