# Verweis auf nicht aufgelöstes externes Symbol "_matClose_d" in Funktion ""public: sta



## jnoessne (9. November 2009)

Hallo,

ich komme aus der Java Ecke und habe weder von C++ noch von Mathlab Ahnung. Jetzt muss ich für ein wissenschaftliches Paper den Graph-Matching Algorithmus unter http://www.seas.upenn.edu/~timothee/software/graph_matching/graph_matching.html zum laufen bringen. 

Mein Ziel ist es, einfach erstmal das Tutorial von denen lauffähig zu bekommen. Jetzt frage ich mich, was ich falsch mache. 

Ich verwende Mathlab 7.8.0 (R2009a) und als C++ Compiler die neueste Version von "Microsoft Visual C++ 2008 Express".

Beim Aufruf von "compileDir" erhalte ich nun mehrere der folgenden Fehler:

Error: compilation of \mex_istril.cpp failed :    Bibliothek "C:\USERS\JANNOE~1\APPDATA\LOCAL\TEMP\MEX_BY~1\templib.x" und Objekt "C:\USERS\JANNOE~1\APPDATA\LOCAL\TEMP\MEX_BY~1\templib.exp" werden erstellt.
mex_istril.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_matClose_d" in Funktion ""public: static void __cdecl MatlabInterface::save2matfile(struct mxArray_tag *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?save2matfile@MatlabInterface@@SAXPAUmxArray_tag@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@1@Z)".
mex_istril.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_matPutVariable_d" in Funktion ""public: static void __cdecl MatlabInterface::save2matfile(struct mxArray_tag *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?save2matfile@MatlabInterface@@SAXPAUmxArray_tag@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@1@Z)".
mex_istril.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_matOpen_d" in Funktion ""public: static void __cdecl MatlabInterface::save2matfile(struct mxArray_tag *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?save2matfile@MatlabInterface@@SAXPAUmxArray_tag@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@1@Z)".
mex_istril.mexw32 : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

  C:\PROGRA~1\MATLAB\R2009A~1\BIN\MEX.PL: Error: Link of 'mex_istril.mexw32' failed.

Nach Recherchen bin ich darauf gekommen, dass es wohl immer um die Funktion "save2matfile" geht. Diese Funktion steht in der Klasse "MatlabInterface" und sieht wie folgt aus:


	static void save2matfile(mxArray *A,string file,string varname){
		//mxArray*mxA=array2mxArray(scores);
		//setDimensions(mxA,m,n);
		//save2matfile(mxA,"C:\\tim\\temp\\trash\\1.mat","A");
		MATFile *pmat = matOpen(file.c_str(), "w");
		if (pmat == NULL)
			assert(0);//mexErrMsgTxt("error accessing mat file\n");
		int status = matPutVariable(pmat, varname.c_str(), A);
		if (status != 0)
			assert(0);//mexErrMsgTxt("error writing mat file\n");
		if (matClose(pmat) != 0)
			mexPrintf("Error closing file %s\n",file.c_str());
		else
			mexPrintf("saved file %s\n",file.c_str());
	}


Da der Paper bereits im Dezember eingereicht werden muss, stehe ich etwas unter Zeitdruck. 

Daher wollte ich fragen, ob irgendjemand eine Idee hat? 
Oder welche Informationen braucht ihr noch, um mir helfen zu können?
Woran könnte es liegen? Ich meine der Code müsste ja genau so laufen

Vielen herzlichen Dank für jede Hilfe!

Jan Nößner


----------



## deepthroat (9. November 2009)

Hi.

Offenbar sind die Funktionen matClose_d, matOpen_d und matPutVariable_d nirgendwo definiert.

D.h. dir fehlt irgendeine (Import-) Bibliothek die diese Funktionen bereitstellt.

Ansonsten mußt du wirklich mal etwas genauer werden. Was für ein Tutorial? Was hast du wo runtergeladen, was hast du dann gemacht etc.

Gruß


----------



## jnoessne (9. November 2009)

Vielen Dank für Deine super schnelle Antwort.

Ich hoffe, dass ich tatsächlich eine Bibliothek nicht habe. Ich weiß aber nicht, wie ich das herausfinde...

Nun schreibe ich Dir ganz genau was ich gemacht habe:

Der Code, den ich verwenden möchte, ist unter http://www.seas.upenn.edu/~timothee/software/graph_matching/graph_matching.html

Danach habe ich folgende Schritte (stehen auch auf dem Link) ausgeführt:


> 1) start matlab
> 2) cd to directory where you unzipped the files (containing a README)
> 3) type init (to add paths) (ignore warnings about assert if any)
> 4) type compileDir (ignore warnings about assert if any)  to compile mex files
> make sure it says at the end: "Compilation of files succeded without error", otherwise try to compile problem files by hand



Also im Prinzip habe ich in *Matlab* die Befehle *init* (funktioniert) und anschließend *compileDir* eingegeben. 

Vielen Dank nochmal für Hilfe!

Jan

PS: Noch so ne Anfängerfrage: Wie kompiliere ich "problem files by hand". Also wie ist in C++ der compile befehl für einzelne klassen...


----------



## deepthroat (9. November 2009)

Also da mußt du wirklich mal jemanden fragen der sich mit Matlab auskennt. Die Funktionen müssten in einer Matlab Bibliothek definiert sein. Evtl. schaust du dir mal die init.m Datei an ob du irgendwelche Pfade anpassen mußt.


----------

