将matlab文件部署到可执行文件

时间:2015-01-29 10:32:18

标签: matlab exe mcc

我想将m文件部署到可执行文件中。我正在使用mcc命令:mcc -m epidemic.m。 Epidemic是我的函数,它不接受任何参数并返回一个向量并将该向量写入txt。 Mcc创建了epidemic.exe,当我运行该exe时,它创建了txt文件,但它似乎没有返回值(.exe的返回值)。我试图使用以下命令从matlab运行exe:

cmd = ['epidemic.exe '];
system(cmd);

它返回cmdout“和状态0.如何获取.exe的返回值?

2 个答案:

答案 0 :(得分:3)

exe没有返回值,您需要找到另一种传输数据的方法,例如通过控制台输出或文本文件。得到的是错误代码和错误消息。

答案 1 :(得分:3)

编译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返回值向量时,您可以像这样独立显示它们:

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
%]