Приложения реализованы с MATLAB® Compiler SDK™ и доступ MATLAB Production Server™ код MATLAB через API сгенерированы от функций MATLAB. Весь код MATLAB, упакованный для использования в этих приложениях, должен быть записан как функция MATLAB.
Компилятор защищает ваш код от несанкционированных изменений. Развертываемые файлы MATLAB приостановлены или заморожены во время компиляции. Это не означает, что вы не можете развернуть гибкое приложение — это означает, что необходимо спроектировать приложение с гибкостью в памяти. Если вы хотите, чтобы конечный пользователь смог выбрать между двумя различными методами, например, оба метода должны быть доступными в развертываемом архиве.
MATLAB Runtime только работает над кодом MATLAB, который был зашифрован, когда развертываемый архив был создан. Любая функция или процесс, который динамически генерирует новый код MATLAB, не будут работать против MATLAB Runtime.
Некоторые тулбоксы MATLAB, такие как продукт Deep Learning Toolbox™, генерируют код MATLAB динамически. Поскольку MATLAB Runtime только выполняет зашифрованные файлы MATLAB, и Deep Learning Toolbox генерирует незашифрованные файлы MATLAB, некоторые функции в Deep Learning Toolbox не могут быть развернуты.
Точно так же функции, которые должны исследовать содержимое файла функции MATLAB, не могут быть развернуты. HELP
, например, является динамическим и не доступным в развернутом режиме. Можно использовать LOADLIBRARY
в развернутом режиме, если вы предоставляете ему прототип функции MATLAB.
Вместо того, чтобы компилировать функцию, которая генерирует код MATLAB и пытающийся развернуть его, выполните следующие задачи:
Запустите код однажды в MATLAB, чтобы получить вашу сгенерированную функцию.
Группируйте код MATLAB, включая сгенерированную функцию.
Совет
Другая альтернатива использованию EVAL
или FEVAL
использует указатели анонимной функции.
Если вы требуете способности создать код MATLAB для динамической обработки во время выполнения, у ваших конечных пользователей должна быть установленная копия MATLAB.
В общем случае хорошие методики программирования отговаривают от перенаправления пути поиска файлов программы динамически в рамках кода. Многие разработчики подвержены этому поведению, поскольку оно подражает действиям, которые они обычно выполняют на командной строке. Однако это может привести к проблемам при развертывании кода.
Например, в развертываемом приложении, MATLAB и Java® пути фиксируются и не могут измениться. Поэтому любая попытка изменить эти пути (использующий cd
команда или addpath
команда) сбои.
Если вы находите, что не можете постараться не помещать addpath
вызовы в вашем коде MATLAB, использовать ismcc
и isdeployed
. Смотрите Использование isdeployed Функции, Чтобы Выполнить Специфичные для развертывания Пути выполнения кода для деталей.
isdeployed
функция позволяет вам задавать, какой фрагмент вашего кода MATLAB развертываем, и который не является. Такая спецификация минимизирует ваши ошибки компиляции и помогает создавать более эффективный, удобный в сопровождении код.
Например, вы находите неизбежным использовать addpath
при записи startup.m
. Используя ismcc
и isdeployed
, вы задаете то, когда и что упаковано и выполнено.
if ~(ismcc || isdeployed) addpath(mypath); end
В зависимости от времени осуществите рефакторинг, оптимизируйте и постройте из модулей код MATLAB, содержащий некомпилируемые или неразвертываемые функции то использование isdeployed
. Вашей возможной целью является “постепенное ухудшение” неразвертываемого кода. Другими словами, код должен представить конечного пользователя с как можно меньшим количеством препятствий развертыванию, пока это практически не устраняется.
Разделите свой код во время проектирования и секции кода во время выполнения:
Design-time code является кодом, который в настоящее время развивается. Почти весь код проходит фазу бесконечной перезаписи, отладки и оптимизации. В некоторых тулбоксах, таких как продукт Deep Learning Toolbox, код проходит период самообучения, когда это реагирует на различные сочетания данных и шаблоны. Такой код почти никогда не проектируется, чтобы быть развернутым.
Run-time code, с другой стороны, укрепился или стал устойчивым — это находится в законченном состоянии и готово быть развернутым конечным пользователем.
Рассмотрите создание отдельной директории для кода, который не предназначен, чтобы быть развернутым или для кода, который вызывает неразвертываемый код.
Избегайте использования следующего:
Глобальные переменные в коде MATLAB
Статические переменные в файлах MEX
Статические переменные в коде Java
Состояние этих переменных является персистентным и разделяемым со всем в процессе.
Когда развертывание приложений, использование персистентных переменных могут вызвать проблемы, потому что процесс MATLAB Runtime запускается в одном потоке. Вы не можете загрузить больше чем одну из этих непостоянных, статических переменных в тот же процесс. Кроме того, эти статические переменные не работают хорошо в многопоточных приложениях.
При программировании против упакованного кода MATLAB необходимо иметь в виду, что экземпляр MATLAB Runtime создается для каждого экземпляра нового класса. Если тот же класс инстанцируют снова с помощью различного имени переменной, он присоединен к экземпляру MATLAB Runtime, созданному предыдущим экземпляром того же класса. Короче говоря, если блок будет содержать n уникальные классы, будет максимум n экземпляров созданного MATLAB Runtime, каждый соответствующий одному или нескольким экземплярам одного из классов.
Если необходимо использовать статические переменные, свяжите их с экземплярами. Например, определение переменных экземпляра в классе Java предпочтительно для определения переменной как static
.
У вас должен быть допустимый MathWorks® лицензия на тулбоксы вы используете, чтобы создать развертываемый код MATLAB.