У меня проблемы с использованием компилятора mcc в MATLAB (Ошибка при использовании ==> mcc Выходной каталог не существует)
Я пытаюсь создать сборочный файл.NET, выполнив этот код в 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]);
Я получаю эту ошибку.
??? Error using ==> mcc
The output directory,
'C:\Users\H\Documents\Project\thesis\Source'
does not exist.
Я уверен, что это из-за пробела в пути к каталогу "...\ Исходный код \...". Потому что, если я просто использую другой путь без пробелов, он прекрасно работает.
Есть ли способ сделать эту работу?
Спасибо.
3 ответа
Я думаю, что настоящая проблема возникает с вашим утверждением EVAL. Вы строите строку для оценки путем объединения строк, таких как dnetdir
а также mfile
каждый из которых будет иметь путь к файлу с пробелом в нем. Результирующая строка, которую вы передадите EVAL, будет выглядеть так:
mcc -N -d C:\Users\H\Documents\Source Code\MatlabFiles\dotnet -W ...
^--Look at that ugly space!
Что вам нужно сделать, это построить вашу строку так, чтобы вокруг этих путей были апострофы, например:
eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
'dotnetclass,0.0,private'' -T link:lib ''' mfile '''']);
Что приведет к строке, которая выглядит следующим образом:
mcc -N -d 'C:\Users\H\Documents\Source Code\MatlabFiles\dotnet' -W ...
И это будет оценено должным образом сейчас, даже с этим неприятным пространством там.
У меня нет опыта работы с mcc
но некоторые другие функции могут страдать от подобных проблем, так как большинство людей привыкли использовать командный режим (то есть аналогично командной строке в DOS, Linux, Mac, ...). Однако большинство функций действительно являются функциями, так что вы можете использовать их в режиме функций и передавать их аргументы в скобках.
Вы также можете использовать mcc в функциональном режиме, как описано в справке. Это может выглядеть примерно так:
mcc('-N', '-d', dnetdir, '-W', 'dotnet:dotnet,dotnetclass,0.0,private', '-T', 'link:lib', mfile);
Таким образом, вам не нужно беспокоиться о побеге любого персонажа.
Попробуйте изменить последнюю строку на:
eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
'dotnetclass,0.0,private'' -T link:lib ' mfile]);
обратите внимание на дополнительные цитаты вокруг dnetdir