No MATLAB, clear mex
descarrega todos os arquivos MEX da memória (a menos que estejam bloqueados). Nas versões anteriores do macOS, eu era capaz de recompilar um arquivo MEX e executar a versão modificada sem reiniciar o MATLAB, simplesmente emitindo um clear mex
comando. Isso não é mais possível no Mojave.
Por exemplo, pegue este arquivo MEX trivial ( 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 criar o arquivo MEX e carregá-lo na memória com
mex get_data_pointer.c
get_data_pointer(0)
Para limpar,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
na verdade, retorna uma matriz de células vazia indicando que nenhum arquivo MEX está carregado na memória, mas version -modules
(não documentado, a partir desta resposta ) ainda aparece /Users/cris/matlab/get_data_pointer.mexmaci64
em sua saída. E alterar o código-fonte do arquivo MEX e recompilar demonstra que, de fato, o arquivo MEX nunca é recarregado, a versão antiga ainda está sendo executada até a saída do MATLAB.
Estou vendo isso no MATLAB R2017a no macOS Mojave. Isso nunca foi um problema com a mesma versão do MATLAB no High Sierra.
Como forçar o MATLAB a descarregar o arquivo MEX sem reiniciar?
Respostas:
Essa é provavelmente a alteração libstdc ++. Esta é uma biblioteca de tempo de execução que a Apple abandonou há algum tempo (XCode 8, eu acho) e finalmente caiu completamente no XCode 10 e no Mojave. Portanto, o arquivo MEX que você possui provavelmente foi compilado com uma versão mais antiga.
As regras do MathWorks sobre compatibilidade de arquivos MEX são que elas geralmente funcionam entre versões, mas se houver uma alteração incompatível (como esta), será necessário recompilar.
fonte