将 matlab 文件部署为可执行文件
Deploy an matlab file to executable
我想将 m 文件部署到可执行文件中。我正在使用 mcc 命令:mcc -m epidemic.m。 Epidemic 是我的函数,它不带任何参数,return 是一个向量,并将该向量写入 txt。 Mcc 创建 epidemic.exe,当我 运行 正在运行该 exe 时,它会创建 txt 文件,但它似乎没有 return 值(.exe 的 return 值)。我正在尝试 运行 来自 matlab 的 exe 使用:
cmd = ['epidemic.exe '];
system(cmd);
它 return cmdout " 和状态 0。我如何获取 .exe 的 returned 值?
exe 没有 return 值,您需要找到其他方式将数据传回,例如通过控制台输出或文本文件。你得到的是错误代码和错误信息。
当你像这样编译 matlab 代码时:
function [out1, out2] = epidemic(in1, in2, in3)
%[
...
%]
为了独立(mcc -m epidemeic.m
),Matlab 以某种方式生成以下伪 C 代码并将其编译为 .exe:
int main(int argc, char** argv)
{
// Load compiled code produced by mcc
HMCRInstance* hInst = loadByteCodeProducedByMccFromResources();
// Similar to have wrote in matlab "epidemic(argv[0], argv[1], ...)"
// 1) Without asking for any argument output
// 2) Argument inputs are passed as strings
int errorCode = mclFevalFromExeArg(hInst, "epidemic", argc, argv);
return errorCode; // only indicates if call to 'mclFEvalFromExeArg'
// succeded, it does not relate to out1, out2 at all.
}
注意:如果您想查看 mcc 生成的确切代码,请使用 mcc -W main -T codegen epidemic.m
因此,直接编译为独立版本,您无法使用 Matlab 函数的输出。如果您需要使用 epidemic
的输出参数,或者
[简单解决方案] 考虑将输出保存到文件或使用 disp
将它们显示到 shell 控制台(注意:您可以在您的 .m 文件中使用 isdeployed
来检查您是来自 matlab 还是编译代码的 运行。
[高级解决方案]考虑将代码编译为共享库 (mcc -l epidemic.m
) 而不是独立 (mcc -m epidemeic.m
)
注意:当您将代码编译到共享库时,mcc
将生成一个导出以下函数的 dll:
extern LIB_epidemeic_C_API
bool MW_CALL_CONV mlxEpidemic(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
nrhs/prhs
是输入参数的数量及其值(如 mxArray
类型)。 nlhs/plhs
是您在调用 epidemic
时想要的输出参数。由您在 mxArray 和等效的 C 本机类型之间进行封送处理。
编辑
当您指出 epidemic
returns 一个值向量时,您可以像这样独立显示它们:
function [output] = epidemic(v1, v2, v3)
%[
% When called from system cmd line, v1, v2, v3 are passed
% as string. Here is how to convert them to expected type if required
if (ischar(v1)), v1 = str2double(v1); end
if (ischar(v2), v2 = str2double(v2); end
if (ischar(v3)), v3 = str2double(v3); end
...
output = ...;
...
if (isdeployed())
disp(output);
end
%]
我想将 m 文件部署到可执行文件中。我正在使用 mcc 命令:mcc -m epidemic.m。 Epidemic 是我的函数,它不带任何参数,return 是一个向量,并将该向量写入 txt。 Mcc 创建 epidemic.exe,当我 运行 正在运行该 exe 时,它会创建 txt 文件,但它似乎没有 return 值(.exe 的 return 值)。我正在尝试 运行 来自 matlab 的 exe 使用:
cmd = ['epidemic.exe '];
system(cmd);
它 return cmdout " 和状态 0。我如何获取 .exe 的 returned 值?
exe 没有 return 值,您需要找到其他方式将数据传回,例如通过控制台输出或文本文件。你得到的是错误代码和错误信息。
当你像这样编译 matlab 代码时:
function [out1, out2] = epidemic(in1, in2, in3)
%[
...
%]
为了独立(mcc -m epidemeic.m
),Matlab 以某种方式生成以下伪 C 代码并将其编译为 .exe:
int main(int argc, char** argv)
{
// Load compiled code produced by mcc
HMCRInstance* hInst = loadByteCodeProducedByMccFromResources();
// Similar to have wrote in matlab "epidemic(argv[0], argv[1], ...)"
// 1) Without asking for any argument output
// 2) Argument inputs are passed as strings
int errorCode = mclFevalFromExeArg(hInst, "epidemic", argc, argv);
return errorCode; // only indicates if call to 'mclFEvalFromExeArg'
// succeded, it does not relate to out1, out2 at all.
}
注意:如果您想查看 mcc 生成的确切代码,请使用 mcc -W main -T codegen epidemic.m
因此,直接编译为独立版本,您无法使用 Matlab 函数的输出。如果您需要使用 epidemic
的输出参数,或者
[简单解决方案] 考虑将输出保存到文件或使用
disp
将它们显示到 shell 控制台(注意:您可以在您的 .m 文件中使用isdeployed
来检查您是来自 matlab 还是编译代码的 运行。[高级解决方案]考虑将代码编译为共享库 (
mcc -l epidemic.m
) 而不是独立 (mcc -m epidemeic.m
)
注意:当您将代码编译到共享库时,mcc
将生成一个导出以下函数的 dll:
extern LIB_epidemeic_C_API
bool MW_CALL_CONV mlxEpidemic(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
nrhs/prhs
是输入参数的数量及其值(如 mxArray
类型)。 nlhs/plhs
是您在调用 epidemic
时想要的输出参数。由您在 mxArray 和等效的 C 本机类型之间进行封送处理。
编辑
当您指出 epidemic
returns 一个值向量时,您可以像这样独立显示它们:
function [output] = epidemic(v1, v2, v3)
%[
% When called from system cmd line, v1, v2, v3 are passed
% as string. Here is how to convert them to expected type if required
if (ischar(v1)), v1 = str2double(v1); end
if (ischar(v2), v2 = str2double(v2); end
if (ischar(v3)), v3 = str2double(v3); end
...
output = ...;
...
if (isdeployed())
disp(output);
end
%]