2012-12-11 44 views
5

Tôi đã tạo một DLL trong MATLAB cung cấp cho tôi một giao diện cho các hàm .m của tôi.Tạo một DLL từ MATLAB

Bây giờ tôi muốn sử dụng nó với Thư viện thời gian chạy MCR. (MCR = Thời gian chạy trình biên dịch Matlab).

Tôi gọi hàm DLL này từ bên trong một thường trình C mà cuối cùng được biên dịch với GCC (MinGW) thành một trình bao bọc DLL.

Bây giờ chức năng của tôi được đưa vào hai hình thức:

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); 

Từ những tôi chọn sau này một khi cựu trên có vẻ là loại "kiểu cũ/di sản".

tôi gọi nó theo cách này:

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; 
} 

Và đây những rắc rối bắt đầu: mxDestroyArray() không thể được tìm thấy trong quá trình liên kết:

undefined reference to `mxDestroyArray' 

Nếu tôi tự thêm -llibmx đến quá trình xây dựng , bản xây dựng chạy, nhưng sau đó không thể tìm thấy libmx.dll vì MCR chỉ đặt $MCR\runtime\win32 vào đường dẫn chứ không phải $MCR\bin\win32 trong đó libmx.dll sống.

Tôi có thể làm gì?

Tôi có phải chọn một chức năng "hủy" khác khi tôi sử dụng DLL tự biên dịch không?

Hoặc tôi có phải đánh lừa xung quanh với đường dẫn không? (Tôi không hy vọng như vậy ...)

Bên cạnh đó, có những chức năng khác mà bị thiếu, nhưng tôi nghĩ rằng điều này sẽ được giải quyết trong cùng một cách:

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

Không chắc đây có phải là giải pháp hay không, nhưng các phiên bản gần đây của Matlab cho phép bạn thêm tệp vào dự án (trước khi biên dịch) không được liên kết tự động. –

Trả lời

0

tôi phát hiện ra rằng nó làm cho một sự khác biệt lớn nếu MCR được sử dụng hoặc cài đặt MATLAB đã cài đặt.

  1. Sử dụng -lmclmcrrt thay vì -lmx và sử dụng đúng đường dẫn thư viện cho trình liên kết.
  2. Sử dụng đúng các tệp #include trong mọi tệp được sử dụng trong quá trình biên dịch. Đặc biệt, không trộn lẫn #include "matrix.h" và tệp tiêu đề được tạo cùng với DLL MATLAB.
Các vấn đề liên quan