1

我们使用脚本环境来自动构建、运行和验证独立的可执行文件。我们正在使用 Matlab R2010a x64。Matlab 编译器 mcc 从构建独立应用程序的 Windows 命令行调用:

mcc -m -v -w enable -I source_folder -I common_folder -a specific_files_we_need our_program

该程序由大约 25 个模块(.m 文件)组成,并使用了大约 5 个工具箱。只要有正确的许可证,它就可以正常工作。mcc 检查可用的编译器许可证,解决依赖关系,将所有内容打包到可执行文件中。

但是,如果许可证不包含所需的工具箱,则 mcc 不会发出任何警告或错误。它在没有工具箱的情况下构建可执行文件。因此,可执行文件启动,乍一看似乎在运行,但如果到达需要工具箱的代码行就会崩溃。

我期望编译器会通知我缺少组件。我可以做些什么来了解缺少的组件?如何确保 mcc 不会将不完整的可执行文件放在一起?我在对 mcc 的调用中遗漏了什么吗?

最好我想以一种在缺少东西时停止编译的方式设置编译。

\兹维克克斯

4

3 回答 3

1

最简单的方法是在您的编译脚本中,您可以检查所需的许可证,即

license('checkout','Compiler')
license('checkout','control_toolbox')

您只需添加 5 个需要签出的工具箱 -> 如果许可功能无法签出许可,则返回 false,您可以使用它来中止编译。

于 2016-07-21T09:39:59.727 回答
0

这就是我最终想出的:

我可以在编译之前检查需要哪些工具箱并相应地调用 license() 。或者我可以对可执行文件本身实施内置检查。(编译后使用特殊参数调用会触发可用工具箱的自检。)在任何一种情况下,我都需要所需工具箱的名称。

我尝试了几种方法来生成工具箱列表。简而言之:在 Matlab 中运行程序,然后输入 license('inuse') 不是很可靠。depfun() 下降很多。mydepfun() 和 fdep() 下降得不够。

我认为 mydepfun() 和 fdep() 的问题在于它们没有进入 \toolbox\shared 文件夹。因此,我从 Tobias Kienzler (链接到原始来源)中获取了 mydepfun()并对其进行了修改:

function [list,callers,tboxes_found] = i_scan(f)

func = i_function_name(f);

[list,~,~,~,~,~,callers,~] = depfun(func,'-toponly','-quiet');

toolboxroot = fullfile(matlabroot,'toolbox');
sharedroot  = strcat(toolboxroot, filesep, 'shared');

intoolbox = strncmpi(list,toolboxroot,numel(toolboxroot));
inshared  = strncmpi(list,sharedroot, numel(sharedroot));

tboxes_found = list(intoolbox & ~inshared);
tboxes_found = regexpi(tboxes_found, '[\\/]toolbox[\\/](.+?)[\\/]', 'tokens');
tboxes_found = cellfun(@(cfun) cfun{1}, tboxes_found);

list = list(~intoolbox | inshared);
callers = callers(~intoolbox | inshared);
for jj = 1:numel(list)
    c = callers{jj};
    cs = cell(numel(c),1);
    for kk = 1:numel(c)
        cs{kk} = list{c(kk)};
    end;
    callers{jj} = cs;
end;

这样 i_scan(f) 将返回工具箱并下降到 \toolbox\shared。mydepfun() 的主要功能只是收集工具箱:

function [filelist,callers,toolboxes] = mydepfun(fn,recursive)
.
.
toolboxes = {};
[filelist,callers,tboxes_found] = i_scan(foundfile);
toolboxes = [toolboxes; tboxes_found];
.
.
[newlist,newcallers,tboxes_found] = i_scan(toscan{1});
toolboxes = [toolboxes; tboxes_found];
.
.
toolboxes = unique(toolboxes);

列出的工具箱是我们的源代码使用的工具箱。修改后的 mydepfun() 似乎工作正常。(除了只有在运行时解决的元素引起的典型问题,如 eval()、函数句柄、回调等)

并且:我见过的依赖步行者 - 比如 mydepfun() - 在里面使用 depfun() 。depfun() 不可靠,因为它默默地忽略不在路径上的所有源代码(在这种情况下,它的返回 prob_files 也是空的)。因此必须注意正确设置 Matlab 路径。(此外,任何额外的路径都是有问题的,因为 Matlab 可能会意外地从其他位置获取具有相同名称的函数。)

毕竟,我认为这是让我的构建过程更可靠的好方法。

/兹维克克斯

于 2016-07-26T23:12:42.037 回答
0

我刚刚从 Mathworks 论坛得到了另一个提示。编译器写出 mccExludedFiles.log。这是列出缺少的工具箱。例如

mccExludedFiles.log:
C:\Program Files\MATLAB\R2010a\toolbox\shared\optimlib\fmincon.m
called by ...c:\temp\whatever\source\code.m
(because the required licenses are not available.)

(不过,源代码中的其他缺失文件并未列出。)

/兹维克克斯

于 2016-07-27T15:48:19.710 回答