Entlädt in MATLAB clear mex
alle MEX-Dateien aus dem Speicher (sofern sie nicht gesperrt sind). In früheren Versionen von macOS konnte ich eine MEX-Datei neu kompilieren und die geänderte Version ausführen, ohne MATLAB neu zu starten, indem ich einfach einen clear mex
Befehl ausgab. Dies ist unter Mojave nicht mehr möglich.
Nehmen Sie zum Beispiel diese triviale MEX-Datei ( get_data_pointer.c
):
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
*(uint64_t*)mxGetData(plhs[0]) = (uint64_t)mxGetData(prhs[0]);
}
Wir können die MEX-Datei erstellen und mit in den Speicher laden
mex get_data_pointer.c
get_data_pointer(0)
Um es zu klären,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
gibt zwar ein leeres Zellenarray zurück, das angibt, dass keine MEX-Dateien in den Speicher geladen sind, aber version -modules
(undokumentiert, aus dieser Antwort ) wird immer noch /Users/cris/matlab/get_data_pointer.mexmaci64
in seiner Ausgabe angezeigt. Das Ändern des Quellcodes der MEX-Datei und das erneute Kompilieren zeigen, dass die MEX-Datei zwar nie neu geladen wird, die alte Version jedoch noch ausgeführt wird, bis MATLAB beendet wird.
Ich sehe dies auf MATLAB R2017a unter macOS Mojave. Dies war mit derselben MATLAB-Version unter High Sierra nie ein Problem.
Wie kann ich MATLAB zwingen, die MEX-Datei ohne Neustart zu entladen?
Antworten:
Das ist wahrscheinlich die libstdc ++ Änderung. Dies ist eine Laufzeitbibliothek, die Apple vor einiger Zeit veraltet hat (XCode 8, glaube ich) und die schließlich vollständig in XCode 10 und Mojave gelöscht wurde . Die MEX-Datei, die Sie haben, wurde wahrscheinlich mit einer älteren Version kompiliert.
Die MathWorks- Regeln zur MEX-Dateikompatibilität lauten, dass sie häufig zwischen Versionen funktionieren. Wenn jedoch eine inkompatible Änderung (wie diese) vorliegt, müssen Sie sie neu kompilieren.
quelle