MinGW-w64로 C/C++ MEX 파일을 컴파일할 때의 문제 해결과 제한 사항
MinGW 이외의 컴파일러로 컴파일한 라이브러리 파일에 링크 금지
MinGW 이외의 컴파일러(예: Microsoft® Visual Studio®)로 컴파일한 라이브러리에 링크하는 MEX 파일을 빌드할 때 MinGW® 컴파일러를 사용하면 그 파일은 MATLAB®에서 실행되지 않습니다. 다른 컴파일러에 의해 생성되는 라이브러리(.lib
) 파일은 서로 호환되지 않습니다.
MinGW에서 dlltool
유틸리티를 사용하여 새 라이브러리 파일을 생성할 수 있습니다.
MinGW 설치 폴더에 공백 포함 금지
경로 이름에 공백이 있는 위치에 MinGW를 설치하지 마십시오. 예를 들어, 다음 폴더를 사용하지 마십시오.
C:\Program Files\mingw-64
대신, 다음을 사용해야 합니다.
C:\mingw-64
MEX 명령은 스스로 MinGW를 선택하지 않음
시스템에 MinGW 컴파일러만 설치되어 있는 경우 mex
명령은 C MEX 파일과 C++ MEX 파일 둘 다에 대해 자동으로 MinGW를 선택합니다. 여러 C 또는 C++ 컴파일러가 있는 경우 mex -setup
을 사용하여 C MEX 파일은 물론이고, 필요하다면 C++ MEX 파일에 대해서도 MinGW를 선택하십시오.
mex -setup mex -setup cpp
mex -setup
만 입력하여 MinGW를 선택하는 경우 C++ 파일을 컴파일하면 mex
가 다른 컴파일러를 선택할 수도 있습니다.
MATLAB에 대해 MinGW를 수동으로 구성하기
MATLAB 애드온 메뉴에서 MinGW를 설치하면 MATLAB에서 MinGW 컴파일러를 자동으로 감지합니다.
Windows® 관리 권한이 있는 경우 필요하다면 configuremingw
스크립트를 사용하여 MinGW를 수동으로 구성할 수 있습니다. 이 스크립트를 다운로드하려면 MATLAB Answers 게시물 "I already have MinGW on my computer. How do I configure it to work with MATLAB?"을 참조하십시오.
MinGW는 Linux의 gcc/g++와 유사하게 동작합니다.
mex
명령을 사용하여 컴파일러 플래그를 수정할 때 Windows 플래그 COMPFLAGS
대신 Linux® 컴파일러 플래그 CFLAGS
또는 CXXFLAGS
를 사용하십시오.
MEX 예외를 사용할 때 C++ MEX 파일 내부에서 발생 가능한 메모리 누수
MinGW-w64 컴파일러로 컴파일한 C++ MEX 파일에서의 오류 처리는 MATLAB 오류 처리와 동일하지 않습니다. C++ MEX 파일에 어떤 클래스가 포함된 경우 mexErrMsgIdAndTxt
함수를 사용하여 MEX 예외를 발생시키면 그 클래스에 대해 생성된 객체에 대한 메모리 누수가 발생할 수 있습니다.
MathWorks는 C Matrix API 대신 C++ MEX API를 사용하는 것을 권장합니다. 자세한 내용은 MATLAB에서 호출 가능한 C++ 함수 작성하기(MEX 파일) 항목을 참조하십시오.
예를 들어, 다음 C++ MEX 함수는 MyClass
클래스를 포함합니다.
#include "mex.h" class MyClass { public: MyClass() { mexPrintf("Constructor called"); } ~MyClass() { mexPrintf("Destructor called"); } }; void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { MyClass X; if (nrhs != 0) { mexErrMsgIdAndTxt("MATLAB:cppfeature:invalidNumInputs", "No input arguments allowed."); } }
MEX 함수는 MyClass
에서 객체 X
를 생성한 다음, 입력 인수의 개수를 확인합니다. MEX 함수가 mexErrMsgIdAndTxt
를 호출하는 경우 MATLAB 오류 처리에서 객체 X
에 대한 메모리를 해제하지 않으므로 메모리 누수가 발생합니다.
C++ MEX 파일에서 처리되지 않은 명시적 예외로 인한 MATLAB의 예기치 않은 종료
C++ MEX 파일에 있는 어떤 함수가 catch
명령문으로 MEX 파일 내에서 포착되지 않는 명시적 예외를 발생시키는 경우, MATLAB 명령줄로 오류를 전파하지 않고 대신 그 예외로 인해 MATLAB이 종료됩니다.
#include "mex.h" class error {}; // Throw an exception of this class class MyClass { public: MyClass(){ mexPrintf("Constructor called."); } ~MyClass(){ mexPrintf("Destructor called."); } }; void doErrorChecking(const MyClass& obj) { // Do error checking throw error(); } void createMyClass() { MyClass myobj; doErrorChecking(myobj); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { createMyClass(); }
MEX 함수는 MyClass
클래스의 객체를 생성하고 함수 doErrorChecking
을 호출하는 createMyClass
를 호출합니다. 함수 doErrorChecking
은 error
유형의 예외를 발생시킵니다. 하지만 이 예외는 MEX 파일 내부에서 포착되지 않고 MATLAB이 예기치 않게 종료되는 원인이 됩니다.
std::exception
클래스에서 상속하는 클래스에 대해서도 이 동작이 발생합니다.
우회적 해결 방법
MEX 함수에서 예외를 포착합니다.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { try{ createMyClass(); } catch(error e){ // Error handling } }