Verweis auf nicht aufgelöstes externes Symbol - matOpen, matPutVariable, matClose



  • 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\JANNOE1\APPDATA\LOCAL\TEMP\MEX_BY1\templib.x" und Objekt "C:\USERS\JANNOE1\APPDATA\LOCAL\TEMP\MEX_BY1\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?basic\_string@DU?char_traits@D@std@@V?allocat or@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,class std::allocator >,class std::basic\_string,class std::allocator >)" (?save2matfile@MatlabInterface@@SAXPAUmxArray\_tag@@V?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocat or@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?basic\_string@DU?char_traits@D@std@@V?$allocat or@D@2@@std@@1@Z)".
    mex_istril.mexw32 : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

    C:\PROGRA1\MATLAB\R2009A1\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



  • Ja, gib doch einfach mal den errorcode in die MSDN ein: LNK2019
    Es ist kein Compile-Fehler, sondern ein Linker-Fehler. D.h. die Implementierung wurde nicht gefunden. Möglichkeit: du hast es selber nicht unter genau der Funktion implementiert. Oder (da du was fremdes benutzt) wirst du die fremde Implementierung (LIB-Datei) nicht dem Linker mitgegeben haben. Irgendwoe muß ne .lib-Datei rumschwirren, die du noch in den Projekteinstellungen unter Linker-Abhängigkeit eintragen mußt. So wie du in Java auch eine JAR in den Classpath legen mußt, muß hier natürlich auch der Linker erstmal die LIB kennen.



  • Super vielen Dank für Deine schnelle Antwort.

    Es ist schonmal gut zu wissen, dass es kein gravierender Fehler ist ;-).

    Trotzdem kann ich mit Deinem Kommentar nicht viel Anfangen. Es gibt in dem gesamten Projekt keine .lib Datei.

    Und das kompillieren wird aus Matlab heraus gestartet mit folgendem Code:

    function filesError = compileDir(dirInput);
    % compiles mex files in specified directory
    % Timothee Cour, 21-Apr-2008 17:31:23
    % This software is made publicly for research use only.
    % It may be modified and redistributed under the terms of the GNU General Public License.
    
    if nargin<1
        dirInput=pwd;
    end
    files=dir2(dirInput);
    filesError = compileFiles({files.filepath});
    

    Das gesamte Projekt befindet sich unter http://www.seas.upenn.edu/~timothee/software/graph_matching/graph_matching.html.

    Vielleicht siehst Du ja auf einen Blick, was da nicht stimmt!

    Danke nochmal für Deine super schnelle Antwort!



  • Das liegt, wie gesagt wurde an den Einstellungen des Projektes in Visual Studio.

    Der Fehler hier:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_matClose_d" in Funktion ""public: static void __cdecl MatlabInterface::save2matfile
    

    weist darauf hin, dass da irgendeine Matlab Bibliothek fehlt. Sprich, also, wie gesagt eine LIB Datei.

    Ich habe mir mal den Ordner runtergeladen. Da ist wirklich nix solchiges dabei.. Musst du ev. sonstige Sachen noch laden?



  • Hallo,

    vielen Dank für Deine Hilfe. Der Autor hat mir mittlerweile geantwortet. Scheinbar sind die Zeilen nicht signifikant für sein Programm und können einfach auskommentiert werden 🕶 .

    Danke nochmal...

    Jan



  • Edit: geklärt! (Dummheit kann wehtun... aua... 🙄 )

    Falls jemand über Google mal hier landet (so wie ich zvor ^^):
    Bei derart kryptischen Linker Erros liegt wohl eher ein Syntaxfehler vor, in meinem Fall der unten kommentierte...

    -----------------------------------------------------------------------------

    Hi, ich hab ein ganz ähnliches Problem, aber leider ist die Fehlermeldung weniger aussagekräftig!

    mainframe.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: void __thiscall MainFrame::OnPartNumber(class wxGridEvent &)" (?OnPartNumber@MainFrame@@AAEXAAVwxGridEvent@@@Z)".
    
    C:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2008\Projects\Programm\Debug\Programm.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    Die Deklaration:

    void OnPartNumber(wxGridEvent& event);
    

    Eintrag in der EVT Table:

    EVT_GRID_CELL_LEFT_DCLICK(MainFrame::OnPartNumber)
    

    Definition:

    void MainFrame::OnPartNumber(wxGridEvent& event)   //hatte einfach nur das MainFrame:: vergessen!  
    {
    }
    

    Neu eingebundene Header-Datei (die auch tatsächlich existiert!):

    #include <wx/grid.h>
    

    Jetzt bin ich ratlos... falls das nicht hierher, sondern ins wxWidgets-Forum gehört, werde ich's gleich verschieben, aber ich dachte bei einem Linker Error frag ich erstmal hier nach... oder? 😕


Log in to reply