Eine Unit im mehreren Packages benutzen - nur wie?



  • warum findet er die definitionen nicht? du definierst doch im header die funktion und bindest diesen dann ein. der pfad sollte dann aber schon stimmen...



  • Sunday schrieb:

    warum findet er die definitionen nicht? ...

    Ups! Meinte den Funktionskörper! Wenn ich nur über Include mache, kommen solche Fehler:

    [Linker Fehler] Unresolved external '__tpdsc__ TUserPicture' referenced from E:\BORLAND\CBUILDER4\PROJECTS\LIB\KSTRETCHIMAGE.LIB|e:\borland\cbuilder4\Lib\StretchImage.cpp.
    [Linker Fehler] Unresolved external 'TUserPicture::' referenced from E:\BORLAND\CBUILDER4\PROJECTS\LIB\KSTRETCHIMAGE.LIB|e:\borland\cbuilder4\Lib\StretchImage.cpp.
    [Linker Fehler] Unresolved external '__fastcall TUserPicture::TUserPicture()' referenced from E:\BORLAND\CBUILDER4\PROJECTS\LIB\KSTRETCHIMAGE.LIB|e:\borland\cbuilder4\Lib\StretchImage.cpp.
    [Linker Fehler] Unresolved external '__fastcall TUserPicture::LoadFromFile(const System::AnsiString)' referenced from E:\BORLAND\CBUILDER4\LIB\MULTIIMAGESCROLLER.OBJ.
    

    DerAltenburger schrieb:

    Schon mal
    USEUNIT "UserPicture.cpp"
    in der Package cpp probiert? (ka ob das hilft! 😉 )

    Nutz nichts! Ist ja das was der Builder automatisch macht!

    DerAltenburger schrieb:

    Mach aus UserPicture ne komponente. Die muss nicht in IDE- Palette integriert sein!
    Die Kompo nimmste auf in Abschnitt "Requires"!!! Das get auch in mehreren Kompos!

    Hab ich gemacht! Folgendes Ergebnis:

    [Linker Fehler] Unresolved external 'TUserPicture::' referenced from E:\BORLAND\CBUILDER4\LIB\STRETCHIMAGE.OBJ.
    [Linker Fehler] Unresolved external '__fastcall TUserPicture::TUserPicture()' referenced from E:\BORLAND\CBUILDER4\LIB\STRETCHIMAGE.OBJ.
    [Linker Fehler] Unresolved external '__tpdsc__ TUserPicture' referenced from E:\BORLAND\CBUILDER4\LIB\STRETCHIMAGE.OBJ.
    

    Hab keine Ahnung was ich machen soll!

    Danke

    Alexander Sulfrian



  • Deine Unit erzeugt eine .obj File, z.B. Unit.obj. Füge diesen Objekt-File Deinem neuen Projekt hinzu. Im Projektmanager rechte Maustaste Add.

    Gruß
    Gerhard



  • Hi,
    auch wenn ich die *.obj dem Packages hinzufüge kommt diese Meldung:

    Alexander Sulfrian schrieb:

    Fehler beim laden des Package! Die Unit ... wird schon vom Package ... verwendet!

    MFG

    Alexander Sulfrian



  • Hmm, dann habe ich Dich wohl falsch verstanden.
    Wenn Du ein neues Packages erzeugst, welches auf Methoden eines anderen Packages zugreift, dann musst den *.bpi File des Packages Deinem Projet hinzufügen.

    Gruß
    Gerhard



  • Gerhard schrieb:

    Wenn Du ein neues Packages erzeugst, welches auf Methoden eines anderen Packages zugreift, dann ...

    NEIN!

    Also nochmal:

    Ich habe ein Klasse in *.h und *.cpp! Diese klasse möchte ich in mehrerenn Packages benutzen! Um eine Klasse zu benutzen muss man doch die *.h includen und die *.cpp zum Projekt (in dem Fall zum Package hinzufügen)! Wenn ich das nun bei mehreren Packages mache kommt die Fehlermeldung!

    MFG

    Alexander Sulfrian



  • ich hab bei mir auch ne unit die verschiedene funktionen, strukturen usw. enthält. diese binde ich einfach mit #include "UnitName.h" in die entsprechenden komponenten ein (wenn der pfad wo anders hinzeigt, dann muss das include angepasst werden), die die unit benutzen sollen. ganz egal ob die im selben package liegen.

    // Header
    void MyFun();
    
    // c++
    void MyFun()
    {
      // ... was machen
    }
    

    sieht mir ganz danach aus, als ob du die unit falsch aufgebaut hast oder ich versteh dein problem einfach nicht. 😉



  • Frage:
    Hast Du eines dieser erzeugten Packages in der IDE installiert ?

    Gruß
    Gerhard



  • Hallo Alexander!

    Ich habe zwar noch keine Komponenten erstellt, die die gleiche Unit enthalten, aber ich kenne dein Problem von normalen BPLs her. Wenn man 2 BPLs gleichzeitig in den Speicher laden will, die beide die gleiche Unit beinhalten, kommt dieser Fehler. Das soll wohl das "bessere Speichermanagement" der BPLs gegenüber den DLLs sein, da ja dann Code doppelt in den Speicher geladen werden würde.
    Deshalb nehme ich keine BPLs mehr 😉 . Die machen mir zuviel Stress.

    Für Komponenten brauchst du natürlich BPLs, das ist mir schon klar. Ich glaube, eine schnelle Lösung wird sein, die Unit in einem der beiden Projekte einfach umzubenennen, d.h. gleicher Inhalt - anderer Name.
    Sauber wäre es wohl, die Unit, die von mehreren BPLs benutzt wird, in eine eigene BPL zu packen, die dann gleichzeitig von beiden BPLs geladen werden kann.

    Solltest du aber eine andere Lösung finden, würde mich das auch mal interessieren.

    mfg
    Klaus



  • eine möglichkeit wäre, aus der klasse eine komponente zu machen und diese dann in den verschiedenen packages einfach benutzen.

    also aus der klasse/komponente auch eine bpl machen.

    ciao



  • Hi,
    also es geht jatzt schon fast! Ich bekomme nur noch wenn ich eine Funktion der Klasse aufrufe eine Uresolved external Fehlermeldung!

    Nach mal eine kurze Übersicht:

    KStretchImage.bpl:

    Contains
    |
    |---- KStretchImage.cpp
    |---- StretchImage.cpp
    |---- KStretchImage.res
    
    Requiers
    |
    |---- vcl40.bpi
    
    -----------------------------------
    #include <UserPicture.h> // in der *.h
    

    KMultiImageScroller.bpl:

    Contains
    |
    |---- KMultiImageScroller.cpp
    |---- MultiImageScroller.cpp
    
    Requiers
    |
    |---- vcl40.bpi
    |---- KStretchImage.bpi
    |---- vcljpg40.bpi
    
    -----------------------------------
    #include <StretchImage.h> // in der *.h
    

    Dies Kompo TStretchImage verwendet TUserPicture ohne Probleme!
    Bei Aufruf von z.B. TStretchImage->TUserPicture->LoadFromFile(...); [sind zum Verständnis die Typen nicht die eigentlichen Namen]aus TMultiImageScroller kommt die oben gennate Fehlermaldung:

    [Linker Fehler] Unresolved external '__fastcall TUserPicture::LoadFromFile(const System::AnsiString)' referenced from E:\BORLAND\CBUILDER4\LIB\MULTIIMAGESCROLLER.OBJ.
    

    Wie bekomme ich die Fehlermeldung weg (Unresolved external)?

    THX

    Alexander Sulfrian



  • warum packst du die beiden komponenten nicht gleich in ein packages?


Anmelden zum Antworten