Linker Fehler
-
Hallo,
hätte da nochmal eine Frage, Hab mir in einem Projekt eine eigene Unit für den TOpenDialog angelegt da ich von verschiedenen Stellen drauf zugreifen muss und mir die Klasse im Konstrukor gleich so zurechtlegen will wie ich's brauch. Allerdings bekomm ich jetzt einen ziemlich hartnäckigen Fehler beim compilieren des Projektes (einzelne Units compilieren ist kein Problem):"Unresolved external '__fastcall Dialogs:Execute(void *)' refernced from...."
Der Code der damit zu tun hat ist folgender:
(Unit "OpenDialogU")
__fastcall TMyOpenDialog::TMyOpenDialog( TComponent *Owner) : TOpenDialog( Owner) { this->DefaultExt="txt"; this->Filter="Text Dateien (*.txt) | *,TXT"; }(Unit "FrameButtonU")
void __fastcall TFrameButton::BitBtnImportClick(TObject *Sender) { TMyOpenDialog *pOpenDialog = new TMyOpenDialog( Owner); pOpenDialog->Execute( ); }Hat da jemand eine Idee? Liegt's an meinen Aufrufkonventionen? Hab's Programm schon neu gestartet und auch den Projektpfad geändert (sowas in der Richtung hat mir Google verraten...).
Danke,
Sascha
-
Hallo
ich habe ein Beispiel mit deinem Code nachgebaut und bekomme keinen Fehler.
Offenbar leitest du noch die Execute-Methode ab, oder greifst irgendwo anders direkt auf die pure virtual Methode Dialogs:Execute zu. Du darfst aber maximal auf TOpenDialog::Execute zugreifen.bis bald
akari
-
Hmm, zugreifen tu ich eigentlich nirgends direkt, versuch gerad stück für stück vorwärts zu kommen... Abgeleitet hab ich sie meines Wissens auch nicht, der zum OpenDialogU gehörende Header sieht folgendermaßen aus:
//--------------------------------------------------------------------------- #ifndef OpenDialogUH #define OpenDialogUH #include <dialogs.hpp> //--------------------------------------------------------------------------- class TMyOpenDialog : public TOpenDialog { __published: __fastcall TMyOpenDialog( TComponent *Owner); private: protected: public: }; #endifHabe ich hier einen Fehler gemacht?
Grüße
Sascha
-
Hallo
habe deinen Header komplett so übernommen und bekomme keinen Fehler.
Allerdings sollte das eher so aussehen :class TMyOpenDialog : public TOpenDialog { private: protected: public: __fastcall TMyOpenDialog( TComponent *Owner); };Linker-Fehler liegen (grad bei unresolved externel) eher in den Implementationsdateien.
bis bald
akari
-
Hy,
also der Fehler tritt in der OPENDIALOGU.OBJ auf, würd von daher drauf tippen das der Fehler auch in der unit steckt und nicht im aufrufenden Objekt, oder?Der Code der OpenDialog.cpp der im ersten Thread fehlte ist folgender:
#pragma hdrstop #include "OpenDialogU.h"Aber darin steckt wohl eher kein Fehler oder?? Versuch jetzt einfach mal die Unit unter einem anderem Namen neu zu erstellen...

Grüße
Sascha
-
Hallo
also ich habe dein Beispiel komplett nachgebaut und bekomme immer noch ekeinen Fehler.
Ich empfehle als letztes noch Projekt/Alle Projekte erzeugen um alle Objekt-Dateien neu zu erzeugen.bis bald
akari
-
Hat leider nichts geändert...

Kann es daran liegen das die beiden Units in unterschiedlichen Verzeichnissen liegen?
Projekt\Ladeoptimierung\GUI\"hier FrameButton.cpp"
Projekt\Ladeoptimierung\ProgLogik\"hier OpenDialog.cpp"Grüße
Sascha
-
Hallo
wenn er die Dateien nicht findet kommen andere Fehlermeldungen.
Bau doch mal ein komplett neues Projekt mit dem hier gezeigten Minimalcode (also so wie ich das gemacht habe)bis bald
akari
-
So, hab das ganze Projekt jetzt mal in der minimal Version nachgebaut und siehe da... gleicher Fehler

Hier einmal der komplette Code der beiden Files, vielleicht mach ich da ja irgendwo 'nen dummen Fehler?!?
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "Unit2.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifUnit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TMyOpenDialog *pOpenDialog = new TMyOpenDialog( Owner); pOpenDialog->Execute( ); } //---------------------------------------------------------------------------Unit2.h
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H #include <dialogs.hpp> //--------------------------------------------------------------------------- class TMyOpenDialog :public TOpenDialog { public: __fastcall TMyOpenDialog(TComponent *Owner); }; #endifUnit2.cpp
//--------------------------------------------------------------------------- #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) __fastcall TMyOpenDialog::TMyOpenDialog( TComponent *Owner) :TOpenDialog( Owner) { this->DefaultExt="txt"; this->Filter="Text Dateien (*.txt)|*.TXT"; }Grüße Sascha
-
Das Minimalbeispiel läßt sich bei mir fehlerfrei kompilieren und ausführen (BCB 6).
-
Hallo
Bei mir auch (BCB 5).
Da ja offenbar eine VCL-interne Funktion angemerkert wird, bleibt noch eine komplette Neuinstallation des Builders. Außerdem den aktuellsten Patch für deine Version einspielen.bis bald
akari
-
Supi, bei allen läuft's nur bei mir nicht...

Benutze das Borland Beveloper Studio 2006, kann es daran liegen?
Oder an meinen Compiler-Einstellungen? Wie sollten diese denn aussehen? Kenn mich da leider nicht aus...Grüße
Sascha