matlabexemcc

Deploy an matlab file to executable


I want to deploy an m file into an executable. I am using mcc command: mcc -m epidemic.m. Epidemic is my function which takes no arguments and returns a vector and write that vector to txt. Mcc creates epidemic.exe and when I am running that exe it creates the txt file however it seems that it doesnt return values (the return value of .exe). I am trying to run the exe from matlab using:

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

It return cmdout " and status 0. How can I take the returned values of the .exe?


Solution

  • When you compile matlab code like:

    function [out1, out2] = epidemic(in1, in2, in3)
    %[
        ...
    %]
    

    to standalone (mcc -m epidemeic.m), Matlab produces somehow the following pseudo c-code and compiles it to .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.
    }
    

    NB: If you want to see the exact code produced by mcc, use mcc -W main -T codegen epidemic.m

    So, directly compiling to standalone, you cannot work with outputs of your Matlab function. If you need to play around with output arguments of epidemic, either

    NB: When you compile your code to shared library, mcc will produce a dll that exports the following function:

    extern LIB_epidemeic_C_API 
    bool MW_CALL_CONV mlxEpidemic(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
    

    nrhs/prhs are the number of input arguments and their values (as mxArray type). And nlhs/plhs are the ouput arguments you want to have when calling epidemic. Up to you to do the marshaling between mxArray and equivalent C native type.

    EDIT

    As you indicate that epidemic returns a vector of values, you can display them from standalone like this:

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