Wrapper DLL Linker Problem



  • Hallo liebe cppler,

    ich möchte eine Wrapper DLL schreiben und habe folgendes (anfänger-) Problem:

    Verweis auf nichtaufgelöstes externes Symbol ""__declspec(dllimport) double __cdecl G3Version() ... in Funktion getVersion
    

    Und da komme ich nicht wirklich weiter, denn ich weiß nicht was/wo ich etwas falsch gemacht habe!

    Was ich bisher gemacht habe:

    Ich habe das in VS2012 als DLL erstellt. Danach habe ich die DLL in das zielverzeichnis kopiert und die lib Pfade angepasst. Auch die zusätzlichen includeverzeichnisse habe ich angepasst, sodass die Header files auch referenziert werden.

    Hier mal mein Code:

    #include "MyDLl.dll"
    
    extern "C" {
      double getVersion(){
         return G3Version();
      }
    }
    

    Die Header Datei:

    #ifdef GRAPH3_PROJECT
    #define DLLEXPORT __declspec(dllexport)
    #else // !defined (GRAPH3_PROJECT)
    #define DLLEXPORT __declspec(dllimport)
    #endif
    
    ....
    
    DLLEXPORT double    G3Version();
    

    Ich bin nicht wirklich bewandert im C/C++ Umfeld, daher bin ich etwas ratlos und erhoffe mir hier mal weitere Schritte, wie ich den Fehler beheben kann und sich so die Wrapper dll erfolgreich erstellen lässt.

    Vielen Dank schonmal und ich hoffe ich könnt was mit meiner Schilderung anfangen!



  • extern "c".



  • Hi,

    danke für den Tip, aber extern "c" ist leider nicht supported. Es kommt der Compile Error C2537



  • Hast du dir mal unter Linkertoolfehler LNK2019 die möglichen Ursachen durchgesehen? Eventuell ist etwas hilfreiches dabei.



  • Ich meine du musst extern "c" auch an deine zu exportierende funktion dranhängen. Jedenfalls wenn es sich um iso c++ handelt und nicht um c++/cli, wie das forum erahnen lässt.



  • Hallo,

    beim durchforsten der möglichen Fehler habe ich jetzt meine IDE zerschossen. 👍 Wird gerade neu installiert 😃

    Die msdn Tipps habe ich so weit ich konnte auch versucht, aber ohne erfolg.Ich weiß auch nicht mehr weiter so langsam.

    @roflo: Was meinst du genau damit? Ich habe doch meine funktion mit extern "C" gekapselt. Und den Headedr der Quelldatei ist ja nur eine Referenz auf die implementierung, wenn ich den header ändere wird doch die Funktion nicht gefunden, oder? Oder denke ich gerade komplett falsch bei deinem Ansatz?

    Die 'Quell'-Funktion aus der DLL ist allerdings nicht mit extern "C" beschrieben. Ist das vielleicht das Problem?



  • Du mußt die andere Library zu den Linkereinstellungen hinzufügen (unter "Eingabedateien" bzw. "Input files")!



  • Hi,

    also nach meiner totalen Verwirrung habe ich nun das Projekt nochmal neu aufgesetzt.

    Das habe ich gemacht:

    * Appwizard --> win32 Anwendung (DLL) ohne MFC erstellt
    * Verweisverzeichnis setzen (Pfad zur lib)
    * zusätzliche Include Verzeichnisse gesetzt (Header)
    * Benötigte DLL in die Verzeichnisse kopiert

    Mein Code:

    // dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
    #include "stdafx.h"
    
    #include "MYIMPORTDLL.H"
    
    //#pragma link("MYIMPORTDLL.dll")
    
    extern "C" _declspec(dllexport) double getVersion();
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    
    extern "C" _declspec(dllexport) double getVersion(){
    	return MYVersion();
    }
    

    Nun bekomme ich Syntaxfehler in abhängigen DLL's... Damit wird wohl deutlich, dass die Einstellungen in meinem Projekt noch nicht korrekt sind, oder?



  • Wie genau sehen denn die Fehler aus? Bzw. wenn du Syntax-Fehler erhältst, solltest du mal deinen Code überprüfen.



  • Auszug aus dem Buildvorgang:

    ------ Erstellen gestartet: Projekt: Wrapper, Konfiguration: Debug Win32 ------
    dllmain.cpp
    c:\pfadzurabhängigendll\abhängige_dll.h(152): error C2143: Syntaxfehler: Es fehlt ';' vor '<'
    c:\pfadzurabhängigendll\abhängige_dll.h(152): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    c:\pfadzurabhängigendll\abhängige_dll.h(153): warning C4091: 'typedef ': Ignoriert auf der linken Seite von 'int', wenn keine Variable deklariert wurde

    Ich habe ja nur 5 Zeilen Code geschrieben (die im vorigen Post ja auch stehen) und da mault die VS IntelliSense ja auch nicht...



  • Folge ich dem Log-Auszug musst du die Syntax-Fehler in deiner "abhängige_dll.h" suchen. Ist das die, die den gezeigten Code enthält?

    Kann ich mir jedoch bei der ersten Meldung kaum vorstellen, da in deinem gezeigten Code kein "<" vorkommt.



  • Hallo,

    vielen Dank für die Antworten! Der Fehler war aber ein ganz anderer...

    Unter zusätzliche Abhängigkeiten habe ich die libs nicht direkt reingepackt, einfach nur aus Unwissenheit. Ich dachte die Biblitiotheksverweispfade zu setzen müsste reichen. 😮

    So kann man sich irren.... Egal, waren ja nur 3 vergebene Tage 🙄

    Trotzdem nochmal vielen Dank für die Tipps, hat mir einige Impulse zur Fehlerbehebung gegeben! 🙂

    Jetzt kann ich euch wenigstens mit Fragen direkt zu c++ auf die Nerven gehen 😃 😃


Log in to reply