Wie löse ich einen nicht aufgelösten externen bei der Verwendung von C++ Builder-Pakete?

Ich experimentiere mit der Neukonfiguration meiner Anwendung zu machen, begnügte sich mit Paketen. Beide, ich und ein anderer Entwickler, ein ähnliches experiment in ein wenig Mühe, beim verknüpfen mit mehreren verschiedenen Paketen. Wir sind wohl beide etwas falsch, aber Gott-weiss-was 🙂

Die situation ist folgende:

  • Das erste Paket PackageA.bpl enthält C++ - Klasse FooA. Die Klasse wird deklariert mit der PACKAGE Richtlinie.
  • Das zweite Paket, PackageB.bpl enthält eine Klasse erbt von FooA genannt FooB. Es umfasst FooB.h, und das Paket ist gebaut mit Laufzeit-packages und links zu PackageA durch das hinzufügen einer Referenz zu PackageA.bpi.

  • Beim Bau PackageB es kompiliert einwandfrei, aber die Verknüpfung schlägt fehl, mit einer Reihe von nicht aufgelöste externe Verweise, der erste von denen einige sind:

    • [ILINK32 Error] Error: Unresolved external '__tpdsc__ FooA' referenced from C:\blah\FooB.OBJ
    • [ILINK32 Error] Error: Unresolved external 'FooA::' referenced from C:\blah\FooB.OBJ
    • [ILINK32 Error] Error: Unresolved external '__fastcall FooA::~FooA()' referenced from blah\FooB.OBJ

    etc.

Läuft TDump auf PackageA.bpl zeigt:

Exports from PackageA.bpl
  14 exported name(s), 14 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002A0C    8 0000 __tpdsc__ FooA
    00002AD8   10 0001 __linkproc__ FooA::Finalize
    00002AC8    9 0002 __linkproc__ FooA::Initialize
    00002E4C   12 0003 __linkproc__ PackageA::Finalize
    00002E3C   11 0004 __linkproc__ PackageA::Initialize
    00006510   14 0007 FooA::
    00002860    5 0008 FooA::FooA(FooA&)
    000027E4    4 0009 FooA::FooA()
    00002770    3 000A __fastcall FooA::~FooA()
    000028DC    6 000B __fastcall FooA::Method1() const
    000028F4    7 000C __fastcall FooA::Method2() const
    00001375    2 000D Finalize
    00001368    1 000E Initialize
    0000610C   13 000F ___CPPdebugHook

Also die Klasse definitiv zu sein scheint, exportiert und zur Verfügung link. Ich kann sehen, dass die Einträge für die spezifischen Dinge, die ILink32 sagt es suchen und nicht finden. Läuft TDump auf der BPI-Datei zeigt ähnliche Einträge.

Andere info

Die Klasse unterstützt die Nachfahren von TObject, der ursprünglich vor dem refactoring in Paketen, es war eine normale Klasse in C++. (Mehr Details unten. Scheint es "sicherer" mit den VCL-style-Klassen, wenn Sie versuchen, Probleme zu lösen, mit einem sehr Delphi-ish Sache wie diese sowieso. Ändern Sie dies nur, ändert sich die Reihenfolge der nicht aufgelöste externe Verweise zunächst nicht finden Method1 und Method2, dann andere.)

Erklärung für FooA:

class PACKAGE FooA: public TObject {
public:
   FooA();
   virtual __fastcall ~FooA();
   FooA(const FooA&);
   virtual __fastcall long Method1() const;
   virtual __fastcall long Method2() const;
};

sowie FooB:

class FooB: public FooA {
public:
   FooB();
   virtual __fastcall ~FooB();
   ... other methods...
};

Alle Methoden werden auf jeden Fall umgesetzt .cpp-Dateien, so dass es nicht nicht Sie zu finden, weil Sie nicht existieren! Die .cpp-Dateien enthalten auch #pragma package(smart_init) in der Nähe der Spitze, unter den includes.

Fragen, die helfen könnten...

  • Sind Pakete zuverlässig mit C++, oder sind Sie nur verwendbar mit Delphi code?
  • Verknüpft ist das erste Paket, indem Sie einen Verweis auf die BPI-richtige - ist, dass, wie Sie soll, es zu tun? Könnte ich eine LIB aber es scheint, um das zweite Paket viel größer, und ich vermute, es ist statisch gelinkt in dem Inhalt des ersten.
  • Können wir PACKAGE Richtlinie nur auf TObjectabgeleiteten Klassen? Es gibt keine compiler-Warnung die Verwendung auf standard-C++ - Klassen.
  • Ist das teilen-code in Pakete der beste Weg, um das Ziel erreichen zu isolieren code und die Kommunikation über definierte Schichten /Schnittstellen? Ich habe die Untersuchung dieser Weg, weil es scheint zu sein, den C++Builder /Delphi Weg, und wenn es funktioniert, es sieht attraktiv aus. Aber gibt es bessere alternativen?
  • Ich bin sehr neu in der Verwendung von Paketen und haben nur von Ihnen bekannt, die durch die Nutzung von Komponenten vor. Allgemeine Ratschläge wären toll!

Verwenden wir C++Builder 2010. Ich habe fabriziert, die Klassen-und Methodennamen in den obigen code-Beispiele, aber auch andere, als dass die details sind genau das, was wir sehen.

InformationsquelleAutor David | 2010-04-28
Schreibe einen Kommentar