主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

在单个应用程序中使用多个共享库

开发使用多个 MATLAB® 共享库的应用程序时,请考虑以下事项:

  • 每个 MATLAB 共享库必须单独初始化。

  • 每个 MATLAB 共享库必须单独终止。

  • MATLAB 函数句柄不能在共享库之间共享。

  • MATLAB 图形句柄不能在共享库之间共享。

  • MATLAB 对象不能在共享库之间共享。

  • C、Java® 和 .NET 对象不能在共享库之间共享。

  • 存储在元胞数组和结构中的可执行数据不能在共享库之间共享

初始化和终止多个共享库

初始化和终止多个共享库:

  1. 使用 mclmcrInitialize() 初始化 MATLAB Runtime

  2. 使用 mclRunMain() 调用执行 MATLAB 代码的应用程序部分。

  3. 在初始化共享库之前,使用 mclInitializeApplication() 初始化 MATLAB 应用程序状态。

  4. 对于每个 MATLAB 共享库,调用生成的初始化函数 libraryInitialize()

  5. 添加用于处理 MATLAB 代码的代码。

  6. 对于每个 MATLAB 共享库,使用生成的终止函数 libraryTerminate() 释放该库使用的资源。

  7. 通过调用 mclTerminateApplication() 释放 MATLAB 运行时使用的资源。

此示例显示了两个共享库的使用。

 示例驱动代码

使用 MATLAB 函数句柄

MATLAB 函数句柄可以 MATLAB 在 Runtime 实例和应用程序之间来回传递。但是,它不能从一个 MATLAB Runtime 实例传递到另一个。例如,假设您有两个 MATLAB 函数,get_plot_handleplot_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.mtransfer.m 打包到单独的共享库中,则无法使用通过 open_acct 创建的账户转移资金。transfer 调用将会引发异常。解决这个问题的一种方法是将两个函数打包到单个共享库中。您还可以重构应用程序,以便不将 MATLAB 对象传递给函数。

另请参阅

主题