【问题标题】:Linking FFTW to matlab using minGW使用 minGW 将 FFTW 链接到 matlab
【发布时间】:2018-04-11 18:19:34
【问题描述】:

我的目标是混合使用库 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++ 时有效,但与 mingw 无关。

【问题讨论】:

  • 看起来需要与 fftw 库链接。比如-lfftw(用-L/path/to/lib提供库所在的路径
  • @Jean-FrançoisFabre 所以我需要生成相应的库吗?如何使用 MinGW 做到这一点?
  • 在 MinGW 上它将是一个 DLL 或 .a 文件。 lib文件是存根AFAIR,无论如何你都需要DLL。您可以在 windows 上使用 fftw 的二进制发行版,无需重新构建它。

标签: c matlab mingw fftw


【解决方案1】:

您已经使编译器能够查看 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

【讨论】:

  • 他们确实是仁慈的。这可能与他们的库被如此广泛使用的原因有关。运行您的命令会出现错误 Error using mex Unknown file extension '.dll'。
  • 是的,这个 FFT 库非常棒。只需确保您的数据方向良好。不要使用 stride != 1,因为它会产生很多缓存未命中。
  • 我无法弄清楚为什么您的命令不起作用,但最终我找到了一台安装了 Visual C++ 的计算机,并且您的命令有效(将 .dll 替换为 .lib)。感谢您的帮助
猜你喜欢
  • 2011-07-22
  • 2020-01-04
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多