2017-06-13 38 views
0

我想知道是否有人从C++ .lib文件创建mex文件的经验。我得到一个.lib及其对应的.h文件,并且需要从Matlab中调用.lib。C++ .lib文件到mex

备注:因为C++文件是.lib文件,所以我看不到.lib文件的实现,但我可以在.h文件中定义调用。

在此先感谢

+0

可以使用Mex命令作为链接器。使用任何你喜欢的编译器将你的所有东西编译成目标文件,然后使用Mex命令将它们链接成Mex可执行文件。 – user3528438

+0

将mex从等式中移出并从命令行构建常规程序,以确保知道需要将哪些开关传递给编译器。然后它可能就像使用相同的开关调用mex一样简单。至少使用g ++。 – user4581301

回答

1

你的.lib最有可能的,所以你必须做的包装功能不支持Matlab的格式。这里是一个小例子(addMat()可能是从你的.lib功能)

#include "mex.h" 
//#include "Your_lib.h" 

// Your local C++ function 
void addMat(double *in1, double *in2, double *out, int R, int C) 
{ 
    for (int n=0; n<R*C; n++) 
    { 
     out[n] = in1[n]+in2[n]; 
    } 
} 

// The Matlab wrapper 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    double *inMat1,*inMat2,*outMat; 
    mwSize R,C; 

    // Pointer to an mxArray of type double 
    inMat1 = mxGetPr(prhs[0]); 
    inMat2 = mxGetPr(prhs[1]); 

    // Get size (assume both are the same as 1st arg) 
    R = mxGetM(prhs[0]); 
    C = mxGetN(prhs[0]); 

    // Create an real output mxArray of size [R,C] 
    plhs[0] = mxCreateDoubleMatrix(R,C,mxREAL); 
    outMat = mxGetPr(plhs[0]);  

    // Call your own function or lib 
    addMat(inMat1,inMat2,outMat,R,C); 
} 

如果您的包装文件被称为addMat.cpp那么你可以编译为

mex addMat.cpp 

,它会产生一个MEX文件,在Matlab中运行它:

A=addMat([1 2 3;1 1 1],[10 11 12; 2 2 2]) 

A = 

    11 13 15 
    3  3  3 

与外部LIB构建命令应该是这样的

mex -I<include dir> -L<lib dir> -l<your lib>.lib addMat.cpp 
+0

所以只需要清楚,我需要从一个单独的C++类引用lib中的调用?然后通过使用“mex ___。cpp”命令编译这个单独的.cpp文件,我将能够在Matlab中访问这些函数? (假设他们在同一个目录中)非常感谢您的帮助。 – 54321

+0

您只需要为您直接从Matlab调用的函数创建包装。生成的.mexw64文件可以位于任何目录中,只要它们包含在Matlab路径中(请参阅addpath())。 –