如何确保Matlab mcc不构建不完整的独立可执行文件?

时间:2016-07-20 21:18:36

标签: matlab matlab-compiler mcc

我们使用脚本环境自动构建,运行和验证独立的可执行文件。我们正在使用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时遗漏了什么吗?

最好我想设置一个如果缺少东西就停止编译的方式。

\ Zweikeks

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这是我最终提出的:

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

我尝试了几种方法来生成工具箱列表。简而言之:在Matlab中运行程序然后输入许可证(' inuse')并不十分可靠。 depfun()下降到很多。

我认为mydepfun()和fdep()的问题是它们不会进入\ toolbox \ shared文件夹。所以我从Tobias Kienzler (link to the original sources)拿了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可能会从其他位置使用相同名称的意外函数。)

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

/ Zweikeks

答案 2 :(得分: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.)

(不会列出源代码中的其他遗漏文件。)

/ Zweikeks