Связывание FFTW с ошибкой g++ на компьютере с Windows

Я пытаюсь научиться использовать FFTW на компьютере с Windows, компилируя с помощью g++ из командной строки Windows. Я прочитал руководство FFTW и поискал по форумам, но ничего не похоже на мою проблему. Я думаю, что не понимаю, как правильно связать библиотеку FFTW. Я загрузил файл FFTW3.zip и скопировал все файлы в каталог, в котором находится мой файл .cpp. Мой простой пример — преобразовать синусоидальную волну с помощью предоставленного кода:

#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);
    }

Команда, которую я использую для компиляции:

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

Ошибка дает мне несколько подчеркнутых ссылок на различные объекты, которые я не могу найти в файле fftw3 или в своем собственном. Далее в последней строке ошибки говорится, что «окончательная ссылка не удалась».

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 для ссылок, все возвращают ошибку

cannot find -lfftw3

Если кто-нибудь знает, как правильно связать эти библиотеки или может определить, почему моя ссылка не работает, я ценю помощь. Спасибо.


person Drew Riley    schedule 11.12.2019    source источник
comment
Пожалуйста, покажите содержимое ..filepath..\\"FFTW learning", чтобы мы могли помочь вам построить правильную командную строку.   -  person Botje    schedule 11.12.2019
comment
Спасибо за ответ. Я использую серверную систему в своем университете, поэтому путь к файлу немного странный, но он выглядит так: \\tawe_dfs\students\1\1915821\Desktop\\C++ Programs\\FFTW Learning   -  person Drew Riley    schedule 12.12.2019
comment
Я также понимаю, что забыл включить -std=c++11 перед командой FFTW.cpp в приведенной выше команде компиляции.   -  person Drew Riley    schedule 12.12.2019
comment
Под содержимым я имел ввиду какие там файлы.   -  person Botje    schedule 12.12.2019
comment
Правильно, конечно. Вот ссылка на скриншот содержимого папки. i.stack.imgur.com/qUxS5.png   -  person Drew Riley    schedule 12.12.2019
comment
Спасибо за все ответы, я пытался использовать -llibffftw3-3, для которого я получаю сообщение об ошибке не могу найти -llibffftw3-3 и -Llibffftw3-3, для которых я получаю исходную ошибку, указанную в списке, говорящую о том, что есть неопределенные ссылки и что последняя ссылка провалился.   -  person Drew Riley    schedule 12.12.2019
comment
-L сообщает компоновщику, ГДЕ искать. -l сообщает компоновщику, ЧТО нужно связать. Поэтому вы должны добавить -L..filepath..\\"FFTW learning" -lllibfftw3-3. Вы также можете просто использовать -L., чтобы указать на текущий каталог.   -  person Botje    schedule 12.12.2019
comment
Спасибо за помощь Botje, я сам только что наткнулся на это.   -  person Drew Riley    schedule 12.12.2019


Ответы (2)


Поскольку это в Windows, я подозреваю, что fftw предлагается в виде файла .lib. В этом случае вы не можете просто использовать -l (работает только для файлов .a и .so), вам нужно сделать -llibfftw3. Это отклонение от условности, но Мингв утверждает то же самое.

person Uninitialized    schedule 11.12.2019
comment
Спасибо за ответ, я пробовал использовать -llibffftw3, -llibffftw3-3, -llibffftwl3-3 и -llibbfftwf3-3. все файлы .dll, включенные в файл .zip. Все это выдает одну и ту же ошибку. В ZIP-файле, предоставленном FFTW, нет файлов .lib. - person Drew Riley; 11.12.2019

Я перепутал свою команду связывания каталога с командой имени библиотеки. Правильная команда g++ выглядит так:

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 указывает имя библиотеки.

Спасибо всем, кто помог.

person Drew Riley    schedule 12.12.2019
comment
См. мое замечание о -L. выше. -I. работает аналогично. Если вы выходите за пределы одного файла .cpp, подумайте о том, чтобы написать Makefile, чтобы связать все это вместе и сэкономить свои запястья. - person Botje; 12.12.2019