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 '];
It return cmdout " and status 0. How can I take the returned values of the .exe?
Best How To :
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, argv, ...)"
// 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
[Simple solution] Consider saving outputs to files or display them to shell console using
disp (NB: you can use
isdeployed in your .m file to check if you're running from matlab or from compiled code).
[Advanced solution] Consider compiling your code to shared library (
mcc -l epidemic.m) instead of standalone (
mcc -m epidemeic.m)
NB: When you compile your code to shared library,
mcc will produce a dll that exports the following function:
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.
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 = ...;