关于 c :FFTW 在 windows 机器上链接 g 错误

FFTW linking with g++ error on windows machine

我正在尝试在 Windows 机器上学习使用 FFTW,使用 Windows 命令行中的 g 进行编译。我已经阅读了 FFTW 手册并搜索了论坛,但似乎没有什么与我的问题相同。我想我不明白如何正确链接到 FFTW 库。我已经下载了 FFTW3.zip 文件并将所有文件复制到我的 .cpp 文件所在的目录中。我的简单示例是使用提供的代码转换正弦波:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<math.h>
#include<string.h>
#include<studio.h>
#include<bits/stdc++.h>
#include<fftw3.h>



int main(){
        int length = 1000;
        fftw_complex time[length];
        fftw_complex signal[length];
        fftw_complex fftsignal[length];
        double omega = 1;
        for (int i=0;i<length;i++){
            time[i][0] = 0.1*i;
            time[i][1] = 0;
            signal[i][0] = sin(time[i][0]*omega);
            signal[i][1] = 0;
        }

        ofstream savefile;
        string name ="sinwave.txt";
        savefile.open(name);
        for (int i=0;i<length;i++){
            savefile <<time[i][0]<<"\\t"<<signal[i][0]<<endl;
        }
        savefile.close();

        fftw_plan my_plan;

        my_plan = fftw_plan_dft_1d(length,signal,fftsignal,FFTW_FORWARD,FFTW_ESTIMATE);

        fftw_execute(my_plan);
        fftw_destroy_plan(my_plan);
        fftw_free(signal);
        fftw_free(fftsignal);
    }

我用来编译的命令是:

1
g++ -I..filepath..\"FFTW learning" -L..filepath..\"FFTW learning" -std=c++11 FFTW.cpp -Lfftw3 -lm

该错误为我提供了对我在 fftw3 文件或我自己的文件中找不到的各种对象的多个未定义的引用。它进一步指出错误的最后一行中的"最终链接失败"。

1
2
3
4
5
6
7
8
C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o:FFTW.cpp:(.text+0x1408): undefined reference to `__imp_fftw_plan_dft_1d'
C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o:FFTW.cpp:(.text+0x1422): undefined reference to `__imp_fftw_execute'

C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o:FFTW.cpp:(.text+0x1435): undefined reference to `__imp_fftw_destroy_plan'
C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o:FFTW.cpp:(.text+0x1448): undefined reference to `__imp_fftw_free'

C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o:FFTW.cpp:(.text+0x145b): undefined reference to `__imp_fftw_free'
c:/programs/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\\Users\\1915821\\AppData\\Local\\Temp\\ccnK99CJ.o: bad reloc address 0x0 in section `.pdata'

c:/programs/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

我也试过用大写和小写 -l 的所有组合作为链接,都返回错误

1
cannot find -lfftw3

如果有人知道如何正确链接到这些库或发现我的链接不起作用的原因,我感谢您的帮助。
谢谢。


由于它在 Windows 上,我怀疑 fftw 是作为 .lib 文件提供的。在这种情况下,您不能只使用 -l(仅适用于 .a 和 .so 文件),您需要使用 -llibfftw3。这是对惯例的偏离,但 Mingw 也是这么说的。


我把我的链接目录命令和库名命令弄错了。正确的 g 命令如下:

1
g++ -I\\\\tawe_dfs\\students\\1\\1915821\\Desktop\"C++ Programs"\"FFTW learning" -L\\\\tawe_dfs\\students\\1\\1915821\\Desktop\"C++ Programs"\"FFTW learning" -std=c++11 FFTW.cpp -llibfftw3-3

这个错误凸显了我的无知,因为 -L 命令指定了编译器的目录,而 -l 命令指定了库名。

感谢所有帮助。