首页 文章

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

提问于
浏览
1

我们使用脚本环境来自动构建,运行和验证独立的可执行文件 . 我们正在使用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不会将不完整的可执行文件放在一起?我在调用mcc时遗漏了什么?

最好我想以一种方式设置编译,如果缺少它就会停止 .

\ Zweikeks

3 回答

  • 0

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

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

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

  • 0

    这就是我最终提出的:

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

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

    我认为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

  • 1

    我刚刚从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

相关问题