dll einbinden



  • hallo,

    ich ahbe folgendes Problem. Ich habe unter Matlab folgendes geschrieben:

    m-file:

    function z=zahlenadd(x,y)
    plot(sin(0:x:2*pi));
    z=x+y;
    

    daraus mit Hilfe des Matlab Compilers folgende Dateien erzeugt:

    easy2.dll
    easy2.exports
    easy2.h
    easy2.lib
    easy2.cpp
    easy2_mcc_component_data.c

    die lib und header datei habe ich hinzugefügt (auch lib gelinked) jedoch bekomme ich immer wieder unresolved externals...

    ich benutze VS2003.net
    folgendes habe ich bereits probiert:
    add reference --> "Error adding reference to the project"
    regsvr32 "easy2.dll" (ich habe es auch mal in den system32 Ordner geschoben)

    bin jetzt ein wenig ratlos...hat irgendjemand mal ein tip???

    vielen dank schonmal



  • Wenn Du Linker- Errors hast, spielt die DLL noch keine Rolle.
    Nur die LIB Datei. (D.h. der Versuch, die DLL ins system32 Verzeichnis zu verschieben bringt nichts.)

    Ich würde Dir empfehlen, mit dem Dependency Walker zu schauen, was exakt exportiert wird. Ev. heissen die Funktionen anders, sind noch C++ Mangled oder habe die falsche Calling Convention.

    http://www.dependencywalker.com/

    Gruss Simon



  • danke echt ein sehr interessantes tool...

    es hat mir gesagt das meine dll auf eine system dll zugreifen wollte, welche ich jetzt habe.

    leider hilft mir das nicht wirklich, denn der fehler besteht weiterhin.

    meine frage immernoch, binde ich die dll den überhaupt richtig ein? oder mache ich fehler beim einbinden der lib 😕 bin mir bei diesen sachen wirklich nicht so sicher.

    danke



  • meine frage immernoch, binde ich die dll den überhaupt richtig ein? oder mache ich fehler beim einbinden der lib 😕 bin mir bei diesen sachen wirklich nicht so sicher

    Die Idee ist korrekt.
    Kompilieren: Header müssen bekannt sein
    Linken: Lib muss bekannt sein (Dlls spielen hier noch keine Rolle!)
    Laufzeit: Dll muss bekannt sein

    Offenbar gibts noch einen Fehler beim Linken:
    - Wird die Lib gefunden?
    - Gibts ev. Release / Debug Build der Lib?
    - Stimmen die Namen der exportierten Funktionen mit den importierten überein?
    - Stimmen die Calling Convertion (__cdecl etc.) überein?

    Edit: Füge mal folgendes in deinen Code ein.

    #pragma comment(lib, "easy2.lib")
    

    Grüsse Simon



  • das habe ich auch schon drin stehen...habe aber jetzt festgestellt, das der fehler irgendwo in der von Matlab erstellten datei liegt.

    meine main ist jetzt leer, jedoch habe ich noch die easy2.cpp
    hier mal die code´s:
    main.cpp

    #include <iostream>
    #include "easy2.h"
    
    #pragma comment (lib,"easy2.lib")
    
    using namespace std;
    
    int main(void)
    {
    	return 0;
    }
    

    und die easy2.cpp

    // MATLAB Compiler: 4.8 (R2008a)
    // Date: Mon May 19 10:17:33 2008
    // Arguments: "-B" "macro_default" "-W" "cpplib:easy2" "-d"
    // "D:\Untersuchungen\MATLAB to C++\Compiler easy\easy2\src" "-T" "link:lib"
    // "-v" "D:\Untersuchungen\MATLAB to C++\zahlenadd.m" 
    //
    
    #include <stdio.h>
    #define EXPORTING_easy2 1
    #include "easy2.h"
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern mclComponentData __MCC_easy2_component_data;
    
    #ifdef __cplusplus
    }
    #endif
    
    static HMCRINSTANCE _mcr_inst = NULL;
    
    #if defined( _MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__LCC__)
    #ifdef __LCC__
    #undef EXTERN_C
    #endif
    #include <windows.h>
    
    static char path_to_dll[_MAX_PATH];
    
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void *pv)
    {
        if (dwReason == DLL_PROCESS_ATTACH)
        {
            if (GetModuleFileName(hInstance, path_to_dll, _MAX_PATH) == 0)
                return FALSE;
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
        }
        return TRUE;
    }
    #endif
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    static int mclDefaultPrintHandler(const char *s)
    {
      return mclWrite(1 /* stdout */, s, sizeof(char)*strlen(s));
    }
    
    #ifdef __cplusplus
    } /* End extern "C" block */
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    static int mclDefaultErrorHandler(const char *s)
    {
      int written = 0;
      size_t len = 0;
      len = strlen(s);
      written = mclWrite(2 /* stderr */, s, sizeof(char)*len);
      if (len > 0 && s[ len-1 ] != '\n')
        written += mclWrite(2 /* stderr */, "\n", sizeof(char));
      return written;
    }
    
    #ifdef __cplusplus
    } /* End extern "C" block */
    #endif
    
    /* This symbol is defined in shared libraries. Define it here
     * (to nothing) in case this isn't a shared library. 
     */
    #ifndef LIB_easy2_C_API 
    #define LIB_easy2_C_API /* No special import/export declaration */
    #endif
    
    LIB_easy2_C_API 
    bool MW_CALL_CONV easy2InitializeWithHandlers(
        mclOutputHandlerFcn error_handler,
        mclOutputHandlerFcn print_handler
    )
    {
      if (_mcr_inst != NULL)
        return true;
      if (!mclmcrInitialize())
        return false;
      if (!GetModuleFileName(GetModuleHandle("easy2"), path_to_dll, _MAX_PATH))
        return false;
      if (!mclInitializeComponentInstanceWithEmbeddedCTF(&_mcr_inst,
                                                         &__MCC_easy2_component_data,
                                                         true, NoObjectType,
                                                         LibTarget, error_handler,
                                                         print_handler, 72956, path_to_dll))
        return false;
      return true;
    }
    
    LIB_easy2_C_API 
    bool MW_CALL_CONV easy2Initialize(void)
    {
      return easy2InitializeWithHandlers(mclDefaultErrorHandler,
                                         mclDefaultPrintHandler);
    }
    
    LIB_easy2_C_API 
    void MW_CALL_CONV easy2Terminate(void)
    {
      if (_mcr_inst != NULL)
        mclTerminateInstance(&_mcr_inst);
    }
    
    LIB_easy2_C_API 
    void MW_CALL_CONV easy2PrintStackTrace(void) 
    {
      char** stackTrace;
      int stackDepth = mclGetStackTrace(_mcr_inst, &stackTrace);
      int i;
      for(i=0; i<stackDepth; i++)
      {
        mclWrite(2 /* stderr */, stackTrace[i], sizeof(char)*strlen(stackTrace[i]));
        mclWrite(2 /* stderr */, "\n", sizeof(char)*strlen("\n"));
      }
      mclFreeStackTrace(&stackTrace, stackDepth);
    }
    
    LIB_easy2_C_API 
    bool MW_CALL_CONV mlxZahlenadd(int nlhs, mxArray *plhs[],
                                   int nrhs, mxArray *prhs[])
    {
      return mclFeval(_mcr_inst, "zahlenadd", nlhs, plhs, nrhs, prhs);
    }
    
    LIB_easy2_CPP_API 
    void MW_CALL_CONV zahlenadd(int nargout, mwArray* z
                                , const mwArray* x, const mwArray* y)
    {
      mclcppMlfFeval(_mcr_inst, "zahlenadd", nargout, 1, 2, &z, &x, &y);
    }
    

    da habe ich ca. 20 unresolved external errors...bsp:

    easy2.obj : error LNK2019: unresolved external symbol _mclcppGetArrayBuffer_730_proxy referenced in function "void __cdecl mclcppMlfFeval(void *,char const *,int,int,int,...)" (?mclcppMlfFeval@@YAXPAXPBDHHHZZ)
    easy2.obj : error LNK2019: unresolved external symbol _mclcppGetLastError_proxy referenced in function "public: static void __cdecl mwException::raise_error(void)" (?raise_error@mwException@@SAXXZ)
    easy2.obj : error LNK2019: unresolved external symbol _mclcppCreateError_proxy referenced in function "public: __thiscall mwException::mwException(void)" (??0mwException@@QAE@XZ)

    is mir wirklich nicht kalr woran das liegt.



  • Suche mal nach den Symbolen , die er nicht findet.
    Irgendwo müssen diese referenziert sein.
    Exportiert werden sie jedenfalls nicht.


Anmelden zum Antworten