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