这就是我最终想出的:
我可以在编译之前检查需要哪些工具箱并相应地调用 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 可能会意外地从其他位置获取具有相同名称的函数。)
毕竟,我认为这是让我的构建过程更可靠的好方法。
/兹维克克斯