При разработке приложений, которые используют несколько MATLAB® разделяемые библиотеки, рассмотрите следующее:
Совместно использованная библиотека каждого MATLAB должна быть инициализирована отдельно.
Совместно использованная библиотека каждого MATLAB должна быть отключена отдельно.
Указатели функции MATLAB не могут быть совместно использованы разделяемыми библиотеками.
Указатели фигуры MATLAB не могут быть совместно использованы разделяемыми библиотеками.
Объекты MATLAB не могут быть совместно использованы разделяемыми библиотеками.
C, Java®, и объекты.NET не могут быть совместно использованы разделяемыми библиотеками.
Исполняемые данные, хранимые в массивах ячеек и структурах, не могут быть совместно использованы разделяемыми библиотеками
Инициализировать и отключить несколько разделяемых библиотек:
Инициализируйте MATLAB Runtime с помощью mclmcrInitialize()
.
Вызовите фрагмент приложения, которое выполняет код MATLAB с помощью mclRunMain()
.
Прежде, чем инициализировать разделяемые библиотеки, инициализируйте состояние приложения MATLAB использование mclInitializeApplication()
.
Поскольку каждый MATLAB совместно использовал библиотеку, вызовите сгенерированную функцию инициализации, library
Initialize()
.
Добавьте код для работы с кодом MATLAB.
Поскольку каждый MATLAB совместно использовал библиотеку, высвободите средства, используемые библиотекой с помощью сгенерированной функции завершения, library
Terminate()
.
Высвободите средства, используемые MATLAB Runtime путем вызова mclTerminateApplication()
.
Этот пример показывает использование двух разделяемых библиотек.
Указатель функции MATLAB может быть передан назад и вперед между экземпляром MATLAB Runtime и приложением. Однако это не может быть передано от одного экземпляра MATLAB Runtime до другого. Например, предположите, что у вас было две функции MATLAB, get_plot_handle
и plot_xy
, и plot_xy
используемый указатель на функцию создается get_plot_handle
.
% Saved as get_plot_handle.m function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize) h = @draw_plot; function draw_plot(x, y) plot(x, y, lnSpec, ... 'LineWidth', lnWidth, ... 'MarkerEdgeColor', mkEdge, ... 'MarkerFaceColor', mkFace, ... 'MarkerSize', mkSize) end end
% Saved as plot_xy.m function plot_xy(x, y, h) h(x, y); end
Если вы упаковали их в две отдельных разделяемых библиотеки, вызов plot_xy
выдал бы исключение.
Код драйвера в качестве примера
Один способ обработать ситуацию состоит в том, чтобы группировать обе функции в одну разделяемую библиотеку. Например, если вы вызвали разделяемую библиотеку plot_functions
, для вашего приложения был бы только нужен один вызов, чтобы инициализировать функцию, и вы могли передать указатель на функцию для plot_xy
без ошибки.
MATLAB Compiler SDK™ позволяет вам возвратить следующие типы объектов от MATLAB Runtime до вашего кода приложения:
MATLAB
C++
.NET
Java
Python®
Однако вы не можете передать объект, созданный в одном экземпляре MATLAB Runtime в различный экземпляр MATLAB Runtime. Этот конфликт может произойти, когда функция, которая возвращает объект и функцию, которая управляет тем объектом, упакована в различные разделяемые библиотеки.
Например, скажите, что вы разрабатываете две функции. Первое создает банковский счет для клиента. Вторые фонды передач между двумя учетными записями.
% Saved as account.m classdef account < handle properties name end properties (SetAccess = protected) balance = 0 number end methods function obj = account(name) obj.name = name; obj.number = round(rand * 1000); end function deposit(obj, deposit) new_bal = obj.balance + deposit; obj.balance = new_bal; end function withdraw(obj, withdrawl) new_bal = obj.balance - withdrawl; obj.balance = new_bal; end end end
% Saved as open_acct .m function acct = open_acct(name, open_bal ) acct = account(name); if open_bal > 0 acct.deposit(open_bal); end end
% Saved as transfer.m function transfer(source, dest, amount) if (source.balance > amount) dest.deposit(amount); source.withdraw(amount); end end
Если вы упаковали open_acct.m
и transfer.m
в отдельные разделяемые библиотеки вы не могли передать фонды с помощью учетных записей, созданных с open_acct
. Вызов transfer
выдал бы исключение. Один способ разрешить это состоит в том, чтобы группировать обе функции в одну разделяемую библиотеку. Вы могли также осуществить рефакторинг приложение, чтобы не передать объекты MATLAB функциям.