Packaging matlab to standalone

Summary

This is about compiling matlab code (.m file) and packaging it into a standalone executable.


Converting .m files can be done easily with the mcc command. It will compile the code with gcc (beware of which gcc version you are using) and provide shell script to run the executable.

To run the code, you will also need the Matlab Compiler Runtime (MCR) which contains run time components.

The MCR is needed for running any compiled standalone. Please note, the MCR is Matlab version dependent, so make sure the target machine is running the same MCR than the compilation machine ! In some cases, a standalone can be kernel dependent ...


Building/finding the MCR

With Matlab version 2008, one can build the MCR using self-extracting files :


PlatformFile self-extracting file location
Windows 32-bit MCRInstaller.exe matlabroot\toolbox\compiler\deploy\win32
Windows 64-bit MCRInstaller.exe matlabroot\toolbox\compiler\deploy\win64
Linux (glnx86) MCRInstaller.bin matlabroot/toolbox/compiler/deploy/glnx86
Linux (glnxa64) MCRInstaller.bin matlabroot/toolbox/compiler/deploy/glnxa64
Mac MCRInstaller.dmg matlabroot/toolbox/compiler/deploy/mac
Mac intel MCRInstaller.dmg matlabroot/toolbox/compiler/deploy/maci
Solaris (sol64) MCRInstaller.bin matlabroot/toolbox/compiler/deploy/sol64

Where matlabroot is where your matlab was installed (i.e. /usr/bin/matlab2008b_PDE/ )

In older Matlab version (< 2008), one included a MCRInstaller.zip file into the distribution. This zip file could be created by running the buildmcr command. This function is now deprecated.


Compiling .mat files with mcc

Let say I have a main function callCNVs.m and that all helper functions are either standard Matlab functions or under a fun/ directory.

My callCNVs.m function looks like :

function callCNVs(input_file, varargin)

if nargin < 1
    error('Missing input file');
end
fprintf('Processing file %s\n', input_file);
end

I can then create my small distribution with

mcc -m -I /home/armand/MATLAB/COLAUS -I /home/armand/MATLAB/COLAUS/fun -d /home/armand/MATLAB/COLAUS_COMPILED callCNVs.m

Where -I specify which directories to include for compilation, -d the destination directory and callCNVs.m the main function.

This will convert callCNVs.m to C, compile it and link functions that are in the include directories.

Looking into /home/armand/MATLAB/COLAUS_COMPILED, I now have :

callCNVs:                      ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, \
dynamically linked (uses shared libs), not stripped
callCNVs_main.c:               ASCII C program text
callCNVs_mcc_component_data.c: ASCII C program text
callCNVs.prj:                  XML document text
mccExcludedFiles.log:          ASCII English text
readme.txt:                    Matlab v5 mat-file
run_callCNVs.sh:               Bourne shell script text executable

To run the standalone, I simply use the run_callCNVs.sh script :

$ sh run_callCNVs.sh /usr/bin/matlab2008b_PDE/ test.dat
------------------------------------------
Setting up environment variables
---
LD_LIBRARY_PATH is .:/usr/bin/matlab2008b_PDE//runtime/glnxa64:/usr/bin/matlab2008b_PDE//bin/glnxa64:/usr/bin/matlab2008b_PDE//sys/os/glnxa64:\
/usr/bin/matlab2008b_PDE//sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/usr/bin/matlab2008b_PDE//sys/java/jre/glnxa64/jre/lib/amd64/server:\
/usr/bin/matlab2008b_PDE//sys/java/jre/glnxa64/jre/lib/amd64/client:/usr/bin/matlab2008b_PDE//sys/java/jre/glnxa64/jre/lib/amd64

Processing file test.dat


Troubleshooting

Error while loading libraries

error while loading shared libraries: libmwmclmcrrt.so: cannot open shared object file: No such file or directory

Most likely your LD_LIBRARY_PATH is not pointing correctly to the MCR. The run_[appName].sh script should do it for you.

$ sh run_callCNVs.sh /path-to-my-MCR/v79 test.dat # i.e. for compiled distrib with Matlab 2008, build v79