2016-07-20 11 views
1

우리는 스크립트 환경을 사용하여 독립 실행 형 실행 파일을 자동으로 작성, 실행 및 확인합니다. 우리는 Matlab R2010a x64를 사용하고 있습니다. matlab에 컴파일러 MCC는 독립 실행 형 응용 프로그램을 구축하는 Windows 명령 줄에서 호출됩니다 Matlab mcc가 불완전한 독립 실행 형 실행 파일을 빌드하지 않도록하려면 어떻게해야합니까?

는 고객 센터 -m -v가 -w -I SOURCE_FOLDER -I common_folder -a specific_files_we_need our_program

이 프로그램을 사용하면 약 25 구성

모듈 (.m 파일)을 사용하며 약 5 개의 도구 상자를 사용합니다. 올바른 라이센스를 사용할 수있는 한 이것은 잘 작동합니다. mcc는 사용 가능한 컴파일러 라이센스를 확인하고, 의존성을 해결하고, 모든 것을 실행 파일에 압축합니다.

그러나 라이센스에 필요한 도구 상자가 포함되어 있지 않은 경우 mcc는 경고 또는 오류를 발행하지 않습니다. 도구 상자없이 실행 파일을 빌드합니다. 실행 파일이 시작되면 언뜻보기에는 실행되지만 도구 상자를 필요로하는 코드 행에 도달하면 충돌이 발생합니다.

누락 된 구성 요소에 대해 알려주는 컴파일러가 필요합니다. 누락 된 구성 요소에 대한 정보를 얻으려면 어떻게해야합니까? mcc가 불완전한 실행 파일을 함께 넣지 않도록하려면 어떻게해야합니까? 엠씨 한테 뭔가 빠졌어요?

바람직하게는 물건을 놓치면 멈추는 방식으로 컴파일을 설정하고 싶습니다. 라이센스 경우> - Zweikeks \

답변

1

가장 간단한 방법은 그냥 체크 아웃해야 할 5 도구 상자를 추가, 즉

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

, 당신은 라이센스가 필요한 수 체크 아웃하여 컴파일 스크립트에 함수 cant checkout 라이센스를 false로 반환하면 컴파일을 중단하는 데 사용할 수 있습니다. 나는() 따라 라이센스를 도구 상자가 필요 컴파일하기 전에 확인하고 호출 할 수 있습니다

:

+0

이 이미 데 도움이, 감사 matlabgui. 그러나 고정 된 도구 상자 집합을 지정해야합니다. 개발자가 다른 도구 상자가 필요한 방식으로 소스를 변경하는 경우 컴파일이 예고없이 다시 실패 할 수 있습니다. – Zweikeks

+0

사실입니다. 당신은 모든 종속 소스 파일을 반복 할 수 있고 그들이 어떤 도구 상자에서 왔는지 볼 수 있습니다. – matlabgui

0

이 드디어 해낸 것입니다. 또는 실행 파일 자체에 내장 체크를 구현할 수 있습니다. (컴파일 후 특수 매개 변수로 호출하면 사용 가능한 도구 상자에 대한 자체 검사가 시작됩니다.) 어느 경우이든 필요한 도구 상자의 이름이 필요합니다.

도구 상자 목록을 생성하는 데 여러 가지 방법을 시도했습니다. 즉, Matlab에서 프로그램을 실행 한 다음 라이센스를 입력하면 ('inuse') 신뢰할 수 없습니다. depfun()은 많은 방법으로 내려갑니다. mydepfun()과 fdep()는 충분히 강하하지 않습니다.

mydepfun() 및 fdep() 문제는 \ toolbox \ shared 폴더로 내려 가지 않는다고 생각합니다. 그래서 토비아스 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)는 도구 상자를 반환하고도 공유 \ 도구 상자 \로 내려된다. 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

0

/. 컴파일러는 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