Jamie Jamie - 1 month ago 15
Linux Question

Packaging .m libraries into MATLAB executables

I feel like this is a relatively basic question, but a solution seems to be beyond my Google-fu.

Setup:



I have a matlab project in ~/project which references a matlab library (cplex) in a folder /s/cplex/matlab. I can successfully compile my application by calling addpath('/s/cplex/matlab') and then running my main() script.

Goal:



I want to build my project as an executable so that it still can reference /s/cplex/matlab. Ideally, /s/cplex/matlab will be packaged into this executable so that it is portable.

Problem:



My attempts at making this work have all been futile. I've pored through http://blogs.mathworks.com/loren/2008/08/11/path-management-in-deployed-applications/ and tried:


  1. Add /s/cplex/cplex/matlab to LD_LIBRARY_PATH before running the executable

  2. Add /s/cplex/cplex/matlab to LD_LIBRARY_PATH before starting MATLAB so that it is on the MATLAB LD_LIBRARY_PATH

  3. Add /s/cplex/cplex/matlab to the Shared Resources and Helper Files panel in MATLAB's deploytool

  4. Add /s/cplex/cplex/matlab to the MATLAB path via addpath() before compiling

  5. Add /s/cplex/cplex/matlab to the Package panel in MATLAB's deploytool



Through all of these attempts, the resulting executable could still not locate the cplex directory. What is the best way to link/package a matlab executable to its .m dependencies?

Answer

Ahah! Fixed it.

Problem

To anyone who had a similar problem, the problem was indeed with the @ symbols. I was using the AFS file system, which resolves @sys in a filepath to the machine/operating system pair. There there were '@sys' strings in my paths to keep it general-purpose, which MATLAB saw and misread as the keyword to denote a class folder.

Solution

I replaced all occurrences of '@sys' with the actual folder name, and MATLAB parsed them correctly. Note that this solution was not immediately obvious because the path I was using was a symbolic link to the full path with the '@sys' strings.