[ILINK32 Fehler] Error: bei selbsterstellter Kompo gesucht
-
Hallo,
ich habe eine Komponente erstellt, die von TDBGrid abgeleitet ist.
In meinem Demoprojekt habe ich im Designmodus die erstellte Komponente auf einer Form abgelegt. Auf der Form befinden sich nur noch ein paar Komponenten zur Verbindung zu einer DB, die aber für das Problem hier ohne Bedeutung sind. Das Kompo-DBGrid wird im Designmodus auch visuell angezeigt.
Die __published Properties lassen sich alle wie gewünscht belegen.Beim Compilieren erhalte ich die Fehlermeldung:
[ILINK32 Fehler] Error: Nicht auflösbares externes 'TmyDBGrid::' referenziert von D:\CBUILDER2009\TEST\DEBUG\DEMO.OBJKann mir jemand sagen wonach der Compiler/Linker sucht =>obj, bpi, bpl, lib? Und vor allem wo? bzw. um welchen Fehler handelt es sich?
In den Projekt-Optionen habe ich die Bibliothekspfade wie folgt eingestellt
D:\CBuilder2009\Test
(BDS)\\lib (BDS)\lib\obj
$(BDS)\lib\psdkAlle mit dem Package erzeugten Dateien befinden sich im Arbeitsverzeichnis des Demos D:\CBuilder2009\Test.
Der Header der Komponente ist eingebunden.Bevor ich das Package im Builder installiert habe, hatte ich es in einer weiteren Demo zur Laufzeit mit new erfolgreich gestartet. Am Konstruktor kann's nach meiner Ansicht deshalb nicht liegen.
TmyDBGrid* gr; __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ gr = new TmyDBGrid(this); gr->Parent = this; //... }
Kann jemand helfen?
-
thunderbol4 schrieb:
Beim Compilieren erhalte ich die Fehlermeldung:
[ILINK32 Fehler] Error: Nicht auflösbares externes 'TmyDBGrid::' referenziert von D:\CBUILDER2009\TEST\DEBUG\DEMO.OBJDas ist der Symbolname der Laufzeit-Typinformationen zu TmyDBGrid.
thunderbol4 schrieb:
Kann mir jemand sagen wonach der Compiler/Linker sucht =>obj, bpi, bpl, lib?
Kommt drauf an. Linkst du mit Laufzeit-Packages? Dann .bpi, ansonsten .lib . Beide sollten unter %ALLUSERSPROFILE%\Gemeinsame Dokumente\RAD Studio\6.0\Dcp liegen (und das sollte auch eigentlich in den Bibliothekspfaden sein).
-
Hallo @audacia,
komme mit Deiner dankenswerten Hilfe leider nicht weiter.Habe unter
Tools->
Optionen->
C++Optionen->
Pfade und Verzeichnisse->Bibliothekspfad:
(ALLUSERSPROFILE)\\Dokumente\\RAD Studio\\6.0\\DCP (ALLUSERSPROFILE)\Dokumente\RAD Studio\6.0\BPL
angelegt.
Dann Package3.bpi, Package3.lib nach ...\DCP kopiert
und Package3.bpl nach ...\BPL.Erhalte leider nach wie vor
[ILINK32 Fehler] Error: Nicht auflösbares externes 'TmyDBGrid::' referenziert von ..\DEBUG\DEMO.OBJDas Blöde ist, ich kann mit dieser Fehlermeldung einfach nichts anfangen, es sind zu wenig Anhaltspunkte, wo man ansetzen kann.
Wie schon gesagt, wenn ich per Hand eine Instanz mit TmyDBGrid erzeuge, klappt das.Um dem Fehler auf die Spur zu kommen habe ich einen Versuch mit einem simplen TButton durchgeführt, den ich für ein Versuchpackage abgeleitet habe.
Das Package, das ich damit erzeugt habe, funktioniert einwandfrei. Die Package-Dateien hatte ich einfach in das Projektverzeichnis des Versuchprogramms kopiert.
-
Hast du das Package denn auch bei deinem Projekt unter Optionen/Packages angegeben?
-
Hast du auch einmal nachgesehen, ob die *.lib- und *.bpi-Dateien überhaupt dort liegen? Das sollten sie standardmäßig tun.
thunderbol4 schrieb:
Dann Package3.bpi, Package3.lib nach ...\DCP kopiert
und Package3.bpl nach ...\BPL.Das ist ja nicht Sinn der Sache. Wenn die *.bpi- und *.lib-Dateien in einem anderen Verzeichnis landen (was - wer hätt's gedacht - dann passiert, wenn du den Ausgabepfad veränderst), dann solltest du auch das entsprechende Verzeichnis zum Bibliothekspfad hinzufügen, nicht erst irgendetwas herumkopieren.
thunderbol4 schrieb:
Erhalte leider nach wie vor
[ILINK32 Fehler] Error: Nicht auflösbares externes 'TmyDBGrid::' referenziert von ..\DEBUG\DEMO.OBJDas Blöde ist, ich kann mit dieser Fehlermeldung einfach nichts anfangen, es sind zu wenig Anhaltspunkte, wo man ansetzen kann.
Wie schon gesagt, wenn ich per Hand eine Instanz mit TmyDBGrid erzeuge, klappt das.Interessant. Die RTTI-Tabelle, die hinter diesem Symbol steckt, wird von allen Objektdateien exportiert, in denen ein Konstruktor der Klasse definiert ist. Wenn die Komponente über den virtuellen Konstruktor erstellt wird, erfordert das natürlich die VMT der Klasse. Wenn du die Klasse im Code erzeugst, wird die VMT bei der Instantiierung generiert. Das führt mich zur Vermutung, daß du den Konstruktor "in-line", also in der Headerdatei definiert hast. Du mußt ihn "out-of-line" in einer zum Package gehörigen .cpp-Datei definieren, sonst enthält das Package gar keine RTTI und auch keine VMT für deine Klasse.
-
Hallo @audacia, @Th69,
zuerst 'mal Danke für Eure Hinweise.
@Th69Th69 schrieb:
Hast du das Package denn auch bei deinem Projekt unter Optionen/Packages angegeben?
Package3 ist auch unter Projektoptionen->Packages angemeldet.
@Audacia
Hier wird nicht rumgemurkst!audacia schrieb:
Interessant. Die RTTI-Tabelle, die...usw
Die Kompo wird ganz normal erstellt:
1) Klasse erstellen.
2) Klasse in einem Testprogramm für sich testen.
3) Klasse in einem Packageproject einbauen und Package erstellen.
4) Package eintragen.Alles Standard.
Mittlerweile habe ich die Kompo zum Laufen gebracht.
Es liegt an der folgenden Ursache:
Die Kompo ist nur als Entwurfspackage vorgesehen. Deshalb habe ich sie bei geschlossenem Projekt unter
->Komponente
->Packages installieren
eingetragen.
In dieser Einstellung können nur Entwurfspackages angemeldet werden, im Gegensatz dazu bei geöffnetem Projekt, wo dann auch Laufzeitpackages angehakt werden kann.Wie sich aber herausstellte, war trotzdem ein Eintrag (Package3) unter Laufzeitpackages, jetzt bei geöffnetem Demoprojekt (mit [ILINK32 Fehler] Error...)
anzutreffen. Warum das so ist und ob das sein muß, weiß ich nicht.
Diesen Eintrag habe ich jedenfalls gelöscht.Und flutsch. Es geht.