Dans MATLAB, clear mex
décharge tous les fichiers MEX de la mémoire (sauf s'ils sont verrouillés). Sous les versions précédentes de macOS, j'ai pu recompiler un fichier MEX et exécuter la version modifiée sans redémarrer MATLAB, simplement en émettant une clear mex
commande. Ce n'est plus possible sous Mojave.
Par exemple, prenez ce fichier 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]);
}
Nous pouvons créer le fichier MEX et le charger en mémoire avec
mex get_data_pointer.c
get_data_pointer(0)
Pour l'effacer,
clear mex
[~,mexfiles] = inmem
version -modules
inmem
renvoie en effet un tableau de cellules vide indiquant qu'aucun fichier MEX n'est chargé en mémoire, mais version -modules
(non documenté, à partir de cette réponse ) apparaît toujours /Users/cris/matlab/get_data_pointer.mexmaci64
dans sa sortie. Et changer le code source du fichier MEX et recompiler démontre qu'en effet, le fichier MEX n'est jamais rechargé, l'ancienne version est toujours en cours d'exécution jusqu'à ce que l'on quitte MATLAB.
Je vois cela sur MATLAB R2017a sur macOS Mojave. Cela n'a jamais été un problème avec la même version MATLAB sous High Sierra.
Comment puis-je forcer MATLAB à décharger le fichier MEX sans redémarrer?
Réponses:
C'est probablement le changement de libstdc ++. Il s'agit d'une bibliothèque d'exécution qu'Apple a déconseillée il y a un certain temps (XCode 8 je pense) et qui a finalement été complètement abandonnée dans XCode 10 et Mojave. Donc, le fichier MEX que vous avez a probablement été compilé avec une version plus ancienne.
Les règles MathWorks sur la compatibilité des fichiers MEX sont qu'elles fonctionnent souvent entre les versions, mais s'il y a un changement incompatible (comme celui-ci), alors vous devez recompiler.
la source