En MATLAB, clear mex
descarga todos los archivos MEX de la memoria (a menos que estén bloqueados). En versiones anteriores de macOS, pude volver a compilar un archivo MEX y ejecutar la versión modificada sin reiniciar MATLAB, simplemente emitiendo un clear mex
comando. Esto ya no es posible con Mojave.
Por ejemplo, tome este trivial archivo 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]);
}
Podemos crear el archivo MEX y cargarlo en la memoria con
mex get_data_pointer.c
get_data_pointer(0)
Para limpiarlo,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
de hecho, devuelve una matriz de celdas vacía que indica que no hay archivos MEX cargados en la memoria, pero version -modules
(no documentado, a partir de esta respuesta ) todavía se muestra /Users/cris/matlab/get_data_pointer.mexmaci64
en su salida. Y cambiar el código fuente del archivo MEX y volver a compilar demuestra que, de hecho, el archivo MEX nunca se vuelve a cargar, la versión anterior todavía se está ejecutando hasta que uno sale de MATLAB.
Estoy viendo esto en MATLAB R2017a en macOS Mojave. Esto nunca fue un problema con la misma versión de MATLAB en High Sierra.
¿Cómo puedo forzar a MATLAB a descargar el archivo MEX sin reiniciar?
Respuestas:
Ese es probablemente el cambio de libstdc ++. Esta es una biblioteca de tiempo de ejecución que Apple desaprobó hace bastante tiempo (creo que XCode 8) y finalmente se cayó por completo en XCode 10 y Mojave. Entonces, el archivo MEX que tiene probablemente se compiló con una versión anterior.
Las reglas de MathWorks sobre compatibilidad de archivos MEX es que a menudo funcionarán entre versiones, pero si hay un cambio incompatible (como este), entonces debe volver a compilar.
fuente