Main Content

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?"을 참조하십시오.

MinGWLinux의 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를 호출합니다. 함수 doErrorCheckingerror 유형의 예외를 발생시킵니다. 하지만 이 예외는 MEX 파일 내부에서 포착되지 않고 MATLAB이 예기치 않게 종료되는 원인이 됩니다.

std::exception 클래스에서 상속하는 클래스에 대해서도 이 동작이 발생합니다.

우회적 해결 방법

MEX 함수에서 예외를 포착합니다.

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    try{
        createMyClass();
    }
    catch(error e){
        // Error handling
    }
}

참고 항목

관련 항목