2012-12-11 4 views
5

내 .m 기능에 대한 인터페이스를 제공하는 MATLAB에서 DLL을 만들었습니다.MATLAB에서 DLL 만들기

이제 MCR 런타임 라이브러리와 함께 사용하고 싶습니다. (MCR = Matlab 컴파일러 런타임).

나는이 DLL을 결국 GCC (MinGW)로 컴파일 된 C 루틴 내에서 래퍼 DLL로 호출한다.

지금 내 기능은 두 가지 형태로 넣어됩니다 : 다음에서

extern LIB_XYZ_C_API 
bool MW_CALL_CONV mlxGet_path(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 
extern LIB_XYZ_C_API bool MW_CALL_CONV mlfGet_path(int nargout, mxArray** p); 

을 가지 "이전 스타일/유산"이 될 것으로 보인다에서 나는 전자와 후자를 선택합니다.

char get_path(LStrHandle path) 
{ 
    char mret = init_XYZ(); // here I call mclmcrInitialize(), mclInitializeApplication(NULL, 0) etc. 
    if (mret) return mret; 
    mret = 2; 
    // here the relevant part begins 
    mxArray * mxpath = NULL; // set it to NULL and let the callee allocate it 
    bool bret = mlfGet_path(1, &mxpath); 
    // now I convert the mxpath to a string 
    // What do I do with the mxpath afterwards? 
    // I try to free it with 
    mxDestroyArray(mxpath); 
    return mret; 
} 

그리고 여기에 문제가 시작 : mxDestroyArray()가 연결 과정에서 찾을 수 없습니다 :

undefined reference to `mxDestroyArray' 

내가 수동으로 빌드 프로세스에 -llibmx를 추가하는 경우

나는이 방법으로 호출 , 빌드가 실행되지만 libmx.dll을 찾을 수 없습니다. MCR은 $MCR\runtime\win32 만 경로에 넣지 만 $MCR\bin\win32은 그렇지 않으므로 libmx.dll 삶.

어떻게해야합니까?

자체 컴파일 된 DLL을 사용할 때 다른 "파괴"기능을 선택해야합니까?

아니면 경로를 어루 만져야합니까? 누락 다른 기능이있다, 게다가

을 (나는 ... 그래서 희망하지 않음),하지만 난이이 같은 방법으로 해결 될 것이라고 생각 : 내가 발견

mxGetNumberOfElements 
mxIsDouble 
mxGetPr 
mxGetM 
mxGetN 
mxGetData 
mxIsChar 
mxIsCell 
mxDestroyArray 
mxGetCell_730 
mxSetCell_730 
mxGetString_730 
mxCalcSingleSubscript_730 
mxGetNumberOfDimensions_730 
mxCreateDoubleMatrix_730 
mxCreateNumericMatrix_730 
mxCreateCellMatrix_730 
+0

이것이 해결책인지 확신 할 수 없지만 최근 버전의 Matlab에서는 자동으로 링크되지 않은 프로젝트에 파일을 추가 할 수 있습니다 (편집 전). –

답변

0

그것을 만드는 MCR이 사용되거나 설치된 MATLAB 설치의 경우 큰 차이가 있습니다.

  1. 대신 사용 -lmx-lmclmcrrt 및 링커에 대한 올바른 라이브러리 경로를 사용합니다.
  2. 컴파일시 사용 된 모든 파일에 올바른 #include 파일을 사용하십시오. 특히 #include "matrix.h"과 MATLAB DLL과 함께 생성 된 헤더 파일을 혼합하지 마십시오.