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

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 に答える