В MATLAB clear mex
выгружает все MEX-файлы из памяти (если они не заблокированы). В предыдущих версиях macOS я мог заново скомпилировать MEX-файл и запустить измененную версию без перезапуска MATLAB, просто выполнив clear mex
команду. Это больше невозможно при Мохаве.
Например, возьмем этот тривиальный 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]);
}
Мы можем создать MEX-файл и загрузить его в память
mex get_data_pointer.c
get_data_pointer(0)
Чтобы очистить это,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
действительно возвращает пустой массив ячеек, указывающий, что MEX-файлы не загружены в память, но version -modules
(недокументированный из этого ответа ) все еще отображается /Users/cris/matlab/get_data_pointer.mexmaci64
в его выводе. И изменение исходного кода MEX-файла и его повторная компиляция демонстрируют, что MEX-файл действительно никогда не перезагружается, старая версия все еще запускается до тех пор, пока не выйдет из MATLAB.
Я вижу это на MATLAB R2017a на MacOS Mojave. Это никогда не было проблемой с той же версией MATLAB под High Sierra.
Как заставить MATLAB выгрузить MEX-файл без перезапуска?
Ответы:
Это вероятно изменение libstdc ++. Это библиотека времени выполнения, которую Apple давно устарела (я думаю, XCode 8), и, наконец, она полностью удалена в XCode 10 и Mojave. Итак, файл MEX, который у вас есть, вероятно, был скомпилирован с более старой версией.
Правила MathWorks по совместимости файлов MEX заключаются в том, что они часто работают между версиями, но если есть несовместимое изменение (например, это), вам нужно перекомпилировать.
источник