使用minGW将FFTW链接到matlab

时间:2018-04-11 18:19:35

标签: c matlab mingw fftw

我的目标是mex来使用库FFTW的c代码。

#include <matrix.h>
#include <mex.h> 
#include "C:\Users\my_user_name\Documents\fftw-3.3.5-dll64\fftw3.h"

void  mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])  
{
    int i, j, bw, bw2_1, size, size2_1, nrow, ncol;
    int data_is_real;
    int cutoff;
    int rank, howmany_rank;
    double *rresult, *iresult, *rdata, *idata;
    double *workspace, *weights;

    fftw_plan dctPlan;
    fftw_plan fftPlan;
    fftw_iodim dims[1], howmany_dims[1];

    bw = 2;
    weights = (double *)malloc(sizeof(double) * 4 * bw);
    rdata = (double *)malloc(sizeof(double) * 5 * bw);
    dctPlan = fftw_plan_r2r_1d(2 * bw, weights, rdata, FFTW_REDFT10, FFTW_ESTIMATE);
}

我目前正在使用minGW和而不是Visual C ++ 。如果(来自Matlab)我打电话

>>mex -c -LC:\Users\my_user_name\Documents\fftw-3.3.5-dll64 demo_fftw.c

它正确编译,但正在运行

>> mex -LC:\Users\my_user_name\Documents\fftw-3.3.5-dll64 demo_fftw.c
Building with 'MinGW64 Compiler (C)'.
Error using mex C:\Users\MPUTHA~1\AppData\Local\Temp\mex_200676192178726_4216\demo_fftw.obj:demo_fftw.c:(.text+0x40):undefined reference to `__imp_fftw_plan_r2r_1d'collect2.exe: error: ld returned 1 exit status

我认为错误是因为虽然fftw_plan_r2r_1d是在fftw3.h中声明的,但它被定义在链接器无法找到的其他地方。我知道如果我使用的是Visual C ++,那么.lib文件包含定义,但是如果您使用的是Visual C ++,README只会告诉您编译lib,并且没有说明使用mingw

什么是mingw的.lib文件的等价物?我还需要.lib吗?如果是这样,我该如何编译它们?

如果这个问题是重复的,我道歉,但是我已经看了一下并找到了许多建议,如果你使用的是Visual C ++,但没有一个关于mingw。

1 个答案:

答案 0 :(得分:0)

您已经使编译器可以看到FFTW包含头文件。

现在,您需要链接实际的FFTW代码。

幸运的是,FFTW创作者对Windows用户非常仁慈,并提供了预先构建的发行版:http://www.fftw.org/install/windows.html

  

我们已经为FFTW 3.3.5创建了单/双/长双精度的预编译DLL文件,以及相关的测试程序。我们希望这些对大多数用户来说已经足够了,因此您无需担心编译FFTW

     

这些DLL是由我们创建的,使用MinGW从GNU / Linux交叉编译;由于mingw-w64项目,64位版本是可能的。您应该可以从任何编译器调用它们。

所以MinGW很好。在你的情况下,我会做(未经测试):

mex -LC:\Users\my_user_name\Documents\fftw-3.3.5-dll64 demo_fftw.c libfftw3-3.dll