W MATLAB, clear mex
zwalnia wszystkie pliki MEX z pamięci (chyba że są zablokowane). W poprzednich wersjach systemu macOS mogłem ponownie skompilować plik MEX i uruchomić zmodyfikowaną wersję bez ponownego uruchamiania MATLAB, po prostu wydając clear mex
polecenie. Nie jest to już możliwe w ramach Mojave.
Weźmy na przykład ten trywialny plik MEX ( 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]);
}
Możemy utworzyć plik MEX i załadować go do pamięci za pomocą
mex get_data_pointer.c
get_data_pointer(0)
Aby to wyczyścić,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
rzeczywiście zwraca pustą tablicę komórek wskazującą, że żadne pliki MEX nie są załadowane do pamięci, ale version -modules
(nieudokumentowane, z tej odpowiedzi ) nadal pokazuje /Users/cris/matlab/get_data_pointer.mexmaci64
na wyjściu. A zmiana kodu źródłowego pliku MEX i ponowna kompilacja pokazuje, że plik MEX nigdy nie jest ponownie ładowany, stara wersja jest nadal uruchomiona, dopóki nie wyjdzie z MATLAB.
Widzę to na MATLAB R2017a na macOS Mojave. To nigdy nie było problemem z tą samą wersją MATLAB w High Sierra.
Jak zmusić MATLAB do zwolnienia pliku MEX bez ponownego uruchamiania?
Odpowiedzi:
To prawdopodobnie zmiana libstdc ++. Jest to biblioteka środowiska wykonawczego, która Apple przestała istnieć jakiś czas temu (chyba XCode 8), a ostatecznie całkowicie spadła w XCode 10 i Mojave. Więc plik MEX, który posiadasz, został prawdopodobnie skompilowany ze starszą wersją.
Reguły MathWorks dotyczące zgodności plików MEX są takie, że często będą działać między wersjami, ale jeśli wystąpi niezgodna zmiana (taka jak ta), musisz ponownie skompilować.
źródło