Tengo problemas para usar el compilador MCC en MATLAB (error usando ==> MCC El directorio de salida no existe)

StackOverflow https://stackoverflow.com/questions/5825243

Pregunta

Estoy tratando de construir el archivo de ensamblaje de .NET ejecutando este código en MATLAB2010B

workdir = 'C:\Users\H\Documents\Source Code\MatlabFiles';
outdir = fullfile(workdir, 'Output');
dnetdir = fullfile(workdir, 'dotnet');

%% Determine file names
mfile = fullfile(workdir, 'perform.m');
dnetdll = fullfile(dnetdir, 'dotnet.dll');

%% Create directories if needed
if (exist(outdir, 'dir') ~= 7)
    mkdir(outdir);
end
if (exist(dnetdir, 'dir') ~= 7)
    mkdir(dnetdir);
end

%% Build .NET Assembly
eval(['mcc -N -d ' dnetdir ' -W ''dotnet:dotnet,' ...
        'dotnetclass,0.0,private'' -T link:lib ' mfile]);

Recibo este error.

??? Error using ==> mcc
The output directory,
  'C:\Users\H\Documents\Project\thesis\Source'
does not exist.

Estoy bastante seguro de que se debe al espacio en la ruta del directorio "... código fuente ...". Porque si solo uso otra ruta sin espacios, funciona perfectamente bien.

¿Hay alguna manera de hacer que esto funcione?

Gracias.

¿Fue útil?

Solución

Creo que el problema real ocurre con tu Evaluación declaración. Construye una cadena para evaluar concatenando cadenas como dnetdir y mfile, cada uno de los cuales tendrá una ruta de archivo con un espacio. La cadena resultante que pase a Eval se verá así:

mcc -N -d C:\Users\H\Documents\Source Code\MatlabFiles\dotnet -W ...
                                     ^--Look at that ugly space!

Lo que debe hacer es construir su cadena para que haya apóstrofes alrededor de estos caminos, como este:

eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
      'dotnetclass,0.0,private'' -T link:lib ''' mfile '''']);

Que dará como resultado una cadena que se vea así:

mcc -N -d 'C:\Users\H\Documents\Source Code\MatlabFiles\dotnet' -W ...

Y que se evaluará correctamente ahora incluso con ese desagradable espacio allí.

Otros consejos

No tengo ninguna experiencia con mcc Pero algunas otras funciones pueden sufrir problemas similares, ya que la mayoría de las personas están acostumbradas a usar el modo de comando (es decir, similar al símbolo del sistema en DOS, Linux, Mac, ...). Sin embargo, la mayoría de las funciones son realmente funciones de tal manera que puede usarlas en el modo de función y pasar sus argumentos entre paréntesis.

También puedes usar MCC en modo de función, como se describe en la ayuda. Eso podría parecer algo así:

mcc('-N', '-d', dnetdir, '-W', 'dotnet:dotnet,dotnetclass,0.0,private', '-T', 'link:lib', mfile);

De esa manera, no debería tener que preocuparse por escapar de ningún personaje.

Intente cambiar la última línea a:

eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
    'dotnetclass,0.0,private'' -T link:lib ' mfile]);

Tenga en cuenta las citas adicionales alrededor dnetdir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top