使用 minGW 将 FFTW 链接到 matlab
Linking FFTW to matlab using minGW
我的目标是混合使用库 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 文件包含定义,但是 README 只告诉你如果你使用的是 Visual C++ 就编译 lib,而对使用 mingw 只字未提。
什么是 mingw 的 .lib 文件?我还需要 .lib 吗?如果是这样,我该如何编译它们?
如果这个问题是重复的,我深表歉意,但我环顾四周,找到了很多建议,如果您使用的是 Visual C++,这些建议是有用的,但是 none 关于 mingw。
您已经使编译器能够看到 FFTW 包含头文件。
现在,您需要link使用实际的 FFTW 代码。
幸运的是,FFTW 创作者对 Windows 用户很仁慈,并在此处提供了 pre-built 发行版:http://www.fftw.org/install/windows.html
We have created precompiled DLL files for FFTW 3.3.5 in single/double/long-double precision, along with the associated test programs. We hope that these are sufficient for most users, so that you need not worry about compiling FFTW
These DLLs were created by us, cross-compiled from GNU/Linux using MinGW; the 64-bit version is possible thanks to the mingw-w64 project. You should be able to call them from any compiler.
所以 MinGW 很好。在你的情况下我会做(未经测试):
mex -LC:\Users\my_user_name\Documents\fftw-3.3.5-dll64 demo_fftw.c libfftw3-3.dll
我的目标是混合使用库 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 文件包含定义,但是 README 只告诉你如果你使用的是 Visual C++ 就编译 lib,而对使用 mingw 只字未提。
什么是 mingw 的 .lib 文件?我还需要 .lib 吗?如果是这样,我该如何编译它们?
如果这个问题是重复的,我深表歉意,但我环顾四周,找到了很多建议,如果您使用的是 Visual C++,这些建议是有用的,但是 none 关于 mingw。
您已经使编译器能够看到 FFTW 包含头文件。
现在,您需要link使用实际的 FFTW 代码。
幸运的是,FFTW 创作者对 Windows 用户很仁慈,并在此处提供了 pre-built 发行版:http://www.fftw.org/install/windows.html
We have created precompiled DLL files for FFTW 3.3.5 in single/double/long-double precision, along with the associated test programs. We hope that these are sufficient for most users, so that you need not worry about compiling FFTW
These DLLs were created by us, cross-compiled from GNU/Linux using MinGW; the 64-bit version is possible thanks to the mingw-w64 project. You should be able to call them from any compiler.
所以 MinGW 很好。在你的情况下我会做(未经测试):
mex -LC:\Users\my_user_name\Documents\fftw-3.3.5-dll64 demo_fftw.c libfftw3-3.dll