Announcement

Collapse
No announcement yet.

BCB 6: Linker Fehler!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BCB 6: Linker Fehler!

    Hallo Leute,

    ich habe ein Linker-Problem. Ein Programm soll beim Start eine
    DLL statisch laden und deren Exportroutinen aufrufen.

    Die nachfolgende Headerdatei wird in sowohl von der DLL, als
    auch von der die DLL ladenden Anwandung eingelesen. Das klappt bei anderen Projekten auch problemlos, aber bei diesem Projekt ist der Wurm drin!

    Die gemeinsame Headerdatei ist (gekürzt) wie folgt:
    ================================================== ===============
    #ifndef ExcSysDeclH
    #define ExcSysDeclH
    enum TExcDlgType {excStd, excSpc};
    # ifdef __DLL__ // Kompilierung in der DLL **********************
    extern "C" __declspec(dllexport)
    bool __stdcall ExcSysInit(char* ApplFileSpec,
    TExcDlgType ExcDlgType,
    bool SaveWarning,
    int MaxCount);
    // weitere Routinendeklarationen ...
    # else // Kompilierung in der verwendenden Anwendung ***********
    extern "C" __declspec(dllimport)
    bool __stdcall ExcSysInit(char* ApplFileSpec,
    TExcDlgType ExcDlgType = excStd,
    bool SaveWarning = false,
    int MaxCount = 20);
    // weitere entsprechende Routinendeklarationen ...
    # endif //************************************************** *****
    #endif
    ================================================== ===============

    In der Anwendung befinden sich Aufrufe wie z. B:

    ExcSysInit(Application->ExeName.c_str(), excStd, true);

    und in der DLL ist die Exportroutine, deren Prototyp in der
    Headerdatei zu finden ist:

    bool __stdcall ExcSysInit(char* ApplFileSpec,
    TExcDlgType ExcDlgType,
    bool SaveWarning,
    int MaxMsgCount)
    {
    ...
    }

    Die Emulationsbibliothek der DLL ist natürlich dem Projekt der
    Anwendung über die Projektverwaltung hinzugefügt worden und auch die Bibliothekspfade sind in den Projektoptionen richtg gesetzt.

    Die DLL wird problemlos kompiliert und gelinkt! Die Kompilierung
    der aufrufenden Anwendung wir ebenso problemlos ausgeführt, nur das Linken schlägt fehl mit der folgenden Meldung:

    [Linker Fehler] Unresolved external 'ExcSysInit'
    referenced from D:\...\DLLTESTFORM.OBJ

    Diese Linkfehler kommen für alle Exportroutinen der DLL!

    Ich weiss leider nicht mehr weiter!Die Hinweise der BCB-Hilfe
    für diesen speziellen Linkfehler helfen mir auch nicht weiter!

    Was habe ich da übersehen? Kann mir jemand helfen? Ich wäre
    sehr dankbar.

    Gruss
    A-Thaddaeus

  • #2
    Kann nicht sehen, dass
    __declspec(dllexport)
    richtig versorgt ist. Wo ist der definiert?

    Du machst es etwas umständlich:

    #ifdef __DLL__
    # define DLL_TYP __declspec(dllexport)
    #else
    # define DLL_TYP __declspec(dllimport)
    #endif

    Dann nur noch
    bool DLL_TYP __stdcall ExcSysInit(..

    siehe auch

    http://www.marquardtnet.info/cecke/tutorials.8/8_dll.html

    zu beachten ist, dass im BCB 6 __DLL__ automatisch bei einem DLL Projekt gesetzt wird. Im BCB 2006 nicht meh
    Christian

    Comment


    • #3
      Guten Tag Christian,

      zunächst möchte ich mich herzlich für Deine freundliche und prompte Hilfe bedanken.

      Ich habe mir Deinen Vorschlag genau angesehen. Dieser erspart mir zwar einige Schreibarbeit, führte aber bei einem Versuch zu keinem besseren Ergebnis als von mit zuvor geschildert. Der bzw. die Linkerfehler bleiben hartnäckig bestehen - leider! Wie dem auch sei, ich habe da wohl irgendetwas gründlich übersehen. Was das ist werde ich jetzt mittels der "Ochsentour" Schritt für Schritt wie folgt zu ermitteln versuchen:

      1. Erstellen eines komplett neuen DLLTest- und DLL Projektes.
      2. Erstellung einer neuen gemeinsamen Headerdatei, mit ebenso schrittweise erfolgenden Erweiterungen.
      3. Erweiterung der DLL Exportfunktionen in weiteren Schritten.

      Wenn das alles gut geht, so werde ich die gesamte Funktionalität meiner bisherigen Projekte in die neuen übernehmen. Mal sehen wie das läuft. Es müßte doch mit dem Teufel zugehen, wenn man das nicht in den Griff kriegen würde.

      Ich werde Dich auf dem Laufenden halten und Dir meinen Fehler mitteilen, wenn ich diesen entdeckt habe. Er ist - vermutlich - trivial. Wir werden sehen!

      Gruss
      A-Thaddaeu

      Comment

      Working...
      X