Linker fehler Mehrdeutige Symbole in der Def



  • hallo,

    CKernelD.def

    LIBRARY      "CKernelD"
    
    EXPORTS
        ; Explizite Exporte können hier eingefügt werden
      GetIniPath    @2
    

    CKernel.h

    #ifdef __cplusplus
    extern "C" {
    #endif  /* __cplusplus */
    
    class CRegD
    {
    protected:
      CRegD();
      ~CRegD();
    
    public:
      ...
      static void         __declspec(dllexport) GetIniFile(void* pObject, CString& sIniFile);
      ...
    };
    
    #ifdef __cplusplus
    }
    #endif
    

    der linker meldet mir u.a. LNK:4002 kann keinen eindeutigen übereinstimmung für symbol 'GetIniPath' finden.

    logisch-> er sieht auch __stdcall CDaoWorkspace::GetIniPath(); in mfcs70d.lib

    wie kann ich diese funktion ausblenden; aber mfcs70d.lib brauch mein project.

    volker



  • Ich finde in deinem Code KEINE Funktion GetIniPath



  • @rene

    doch hab das falsche gelöscht

    static void         __declspec(dllexport) GetIniFile(void* pObject, CString& sIniFile);
    static void         __declspec(dllexport) GetIniPath(CString& sIniPath);
    


  • Wozu brauchst Du 2 Exporttabellen, 1. als Name und 2. als Integer?



  • Original erstellt von RenéG:
    Wozu brauchst Du 2 Exporttabellen, 1. als Name und 2. als Integer?

    ???

    ich will eigendlich nur die function GetIniPath exportieren.

    LIBRARY      "CKernelD"
    
    EXPORTS
      GetIniPath
        ; Explizite Exporte können hier eingefügt werden
    

    leider kann der linker das symbol(func) nicht eindeutig zuordnen, da er diese
    auch in _stdcall CDaoWorkspace::GetIniPath() (mfcs70d.lib) findet.

    wenn ich GetIniPath nicht exportieren, kann ich die function wie folgt nicht aufrufen;

    ...
      if (HINSTANCE hInst=LoadLibrary("CKernelD.dll"))
      {
        if (pGetIniPath pFunc=(pGetIniPath)GetProcAddress(hInst, "GetIniPath"))
        {
          pFunc(tReg.pObject, m_sFile);
        }
        #ifdef _DEBUG
          else ASSERT(0);
        #endif
        FreeLibrary(hInst);
      }
    ...
    

    die CKernelD.lib kann ich in den oberen code nicht einbinden, da sonst die beiden dll (bei der erstellen gegenseitig abhängig werden)

    volker

    [ Dieser Beitrag wurde am 16.04.2003 um 14:05 Uhr von vdittrich editiert. ]



  • __declspec(dllexport) exportiert doch Deinen Namen schon, so dass Du ihn per GetProcAddress ermitteln kannst!



  • Deine Funktion sollte nicht innerhalb der Klasse stehen, da hier ein von C++ dekorierter Name erstellt wird, der zusätzlich aus dem Klassennamen besteht. Damit funzt dann GetProcAddress nicht mehr. Ausser natürlich, du kennst den dekorierten Namen. Dieser steht übrigens in der Export-Tabelle der generierten DLL !



  • das dumme ist eben nicht ???

    #pragma once
    #include "../CMsgDll/Resource.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif  /* __cplusplus */
    
    typedef enum vStateDB
    {
      VDB_OPEN       = IDS_DB_OPEN,
      VDB_NEW        = IDS_DB_NEW,
      VDB_RECONNECT  = IDS_DB_RECONNECT,
      VDB_OPEN_AFTER = IDS_DB_OPEN_AFTER_RECONNECT,
      VDB_ERROR      = IDS_DB_ERROR,
      VDB_CLOSE      = IDS_DB_CLOSE,
      VDB_CLOSED     = IDS_DB_CLOSED,
    };
    
    struct rRegWnd;                                   //foward deklaration
    
    typedef void (*pStateDB)(void* pOb, vStateDB); 
    typedef void (*pGetIniPath)(void* pObject, CString& sIniFile); 
    
    struct rRegWnd
    {
      void*    pObject;
      HWND     hwnd;
      pStateDB _StateDB;
      CString  sINI;
     };
    
    #pragma warning(disable:4190)
    
    typedef rRegWnd (*pGetReg) (void* pObject);
    
    class CRegDEx;    // wird vererbt in class CRegDEx: public CRegD
    
    class CRegD
    {
    protected:
      CRegD();
      ~CRegD();
    
    public:
      static pGetReg      __declspec(dllexport) AddReg(rRegWnd& tRegWnd);
      static bool         __declspec(dllexport) DelReg(void* pObject);                          // ret true -> close hWnd self
      static void         __declspec(dllexport) GetIniPath(void* pObject, CString& sIniFile);
      static vStateDB     __declspec(dllexport) GetDBState(void);
    
    private:
      static rRegWnd _pGetReg(void* pObject);
    
    protected:
      ...
    };
    
    #pragma warning(default:4190)
    
    #ifdef __cplusplus
    }
    #endif
    


  • das dumme ist eben nicht ???

    Worauf beziehst du das jetzt?



  • Original erstellt von RenéG:
    **[quote]
    das dumme ist eben nicht ???
    **

    **
    Worauf beziehst du das jetzt?**[/QUOTE]

    ->> _declspec(dllexport) exportiert doch Deinen Namen schon, so dass Du ihn per GetProcAddress ermitteln kannst!

    Deine Funktion sollte nicht innerhalb der Klasse stehen, da hier ein von C++ dekorierter Name erstellt wird, der zusätzlich aus dem Klassennamen besteht. Damit funzt dann GetProcAddress nicht mehr. Ausser natürlich, du kennst den dekorierten Namen. Dieser steht übrigens in der Export-Tabelle der generierten DLL !

    könnte so was in der art sein __imp_?AddReg@CRegD

    aber man kann den guten stück ja auch einen anderen namen geben wie GetIniPathEx().

    aber mit der

    innerhalb der Klasse ...

    muß ich mir merken, ist eigendlich logisch.

    danke für deine hilfe volker


Anmelden zum Antworten