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.cdie 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 sicherDie Idee ist korrekt.
Kompilieren: Header müssen bekannt sein
Linken: Lib muss bekannt sein (Dlls spielen hier noch keine Rolle!)
Laufzeit: Dll muss bekannt seinOffenbar 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.