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



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

mcc-m-v-w enable-I source_folder-I common_folder-a specific _files_we_need our_program

该程序由大约25个模块(.m文件)组成,使用大约5个工具箱。只要有正确的许可证,这一切都很好。mcc检查可用的编译器许可证,解析依赖关系,将所有内容打包到可执行文件中。

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

我期望编译器通知我丢失的组件。我可以做些什么来了解丢失的组件?如何确保mcc不会将不完整的可执行文件组合在一起?我是不是在给麦克的电话里遗漏了什么?

最好是,我希望以一种在缺少东西时停止编译的方式来设置编译。

\Zweikeks

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

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

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

这就是我最终想到的:

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

我尝试了几种方法来生成工具箱列表。简而言之:在Matlab中运行程序,然后输入许可证("使用")不是很可靠。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可能会意外地从其他位置获取相同名称的函数。)

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

/Zweikeks

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

mccExludedFiles.log:
C:Program FilesMATLABR2010atoolboxsharedoptimlibfmincon.m
called by ...c:tempwhateversourcecode.m
(because the required licenses are not available.)

(不过,源代码中其他丢失的文件没有列出。)

/Zweikeks

相关内容

  • 没有找到相关文章

最新更新