在单个应用程序中使用多个共享库
开发使用多个 MATLAB® 共享库的应用程序时,请考虑以下事项:
每个 MATLAB 共享库必须单独初始化。
每个 MATLAB 共享库必须单独终止。
MATLAB 函数句柄不能在共享库之间共享。
MATLAB 图形句柄不能在共享库之间共享。
MATLAB 对象不能在共享库之间共享。
C、Java® 和 .NET 对象不能在共享库之间共享。
存储在元胞数组和结构中的可执行数据不能在共享库之间共享
初始化和终止多个共享库
初始化和终止多个共享库:
使用
mclmcrInitialize()
初始化 MATLAB Runtime。使用
mclRunMain()
调用执行 MATLAB 代码的应用程序部分。在初始化共享库之前,使用
mclInitializeApplication()
初始化 MATLAB 应用程序状态。对于每个 MATLAB 共享库,调用生成的初始化函数
library
Initialize()
。添加用于处理 MATLAB 代码的代码。
对于每个 MATLAB 共享库,使用生成的终止函数
library
Terminate()
释放该库使用的资源。通过调用
mclTerminateApplication()
释放 MATLAB 运行时使用的资源。
此示例显示了两个共享库的使用。
使用 MATLAB 函数句柄
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 对象传递给函数。