2015-01-12 24 views
1

嗯,這是我遇到的一個非常奇怪的錯誤。fftw庫,未定義的引用'fftwf_ *'

當我嘗試編譯我的程序由命令FFTW庫:

g++ -std=c++11 -o main main.cpp BFSCcommandlineParser.cpp BFSCframe.cpp BFSCgeometry.cpp ImageIO.cpp -lfftw3 -lm 

...我得到這個:

/tmp/cczUuTb0.o: In function `fftw_prog::fftw_prog(char const*)': 
main.cpp:(.text._ZN9fftw_progC2EPKc[_ZN9fftw_progC5EPKc]+0x5c): undefined reference to `fftwf_import_wisdom_from_file' 
/tmp/cczUuTb0.o: In function `fftw_prog::~fftw_prog()': 
main.cpp:(.text._ZN9fftw_progD2Ev[_ZN9fftw_progD5Ev]+0x31): undefined reference to `fftwf_export_wisdom_to_file' 
/tmp/cczUuTb0.o: In function `fft<2, float, std::complex<float> >::fft(tensor<int, 2ul>, bool)': 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEEC2E6tensorIiLm2EEb[_ZN3fftILi2EfSt7complexIfEEC5E6tensorIiLm2EEb]+0xcf): undefined reference to `fftwf_plan_dft_r2c' 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEEC2E6tensorIiLm2EEb[_ZN3fftILi2EfSt7complexIfEEC5E6tensorIiLm2EEb]+0x111): undefined reference to `fftwf_plan_dft_c2r' 
/tmp/cczUuTb0.o: In function `fft<2, float, std::complex<float> >::~fft()': 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEED2Ev[_ZN3fftILi2EfSt7complexIfEED5Ev]+0x25): undefined reference to `fftwf_free' 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEED2Ev[_ZN3fftILi2EfSt7complexIfEED5Ev]+0x35): undefined reference to `fftwf_destroy_plan' 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEED2Ev[_ZN3fftILi2EfSt7complexIfEED5Ev]+0x45): undefined reference to `fftwf_destroy_plan' 
/tmp/cczUuTb0.o: In function `fft<2, float, std::complex<float> >::r2F()': 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEE3r2FEv[_ZN3fftILi2EfSt7complexIfEE3r2FEv]+0x25): undefined reference to `fftwf_execute' 
/tmp/cczUuTb0.o: In function `fft<2, float, std::complex<float> >::F2r()': 
main.cpp:(.text._ZN3fftILi2EfSt7complexIfEE3F2rEv[_ZN3fftILi2EfSt7complexIfEE3F2rEv]+0x35): undefined reference to `fftwf_execute' 
collect2: error: ld returned 1 exit status 

我想這可能是FFTW本身有問題,所以我用proram測試了這個庫,它工作。這意味着並非如此。 以下代碼是我的文件中的一個模板,這是我的項目中使用fftw的唯一一個模板。

template <int N, typename rT, typename FT> 
     inline fft<N,rT,FT>::~fft() { 
     if (data != 0) { 
      if (Precision<rT>::IsFloat) { 
       fftwf_free((fftwf_complex *)data); 
       fftwf_destroy_plan((fftwf_plan_s*) r2Fplan); 
       fftwf_destroy_plan((fftwf_plan_s*) F2rplan); 
      } 
      else { 
       fftw_free((fftw_complex *)data); 
       fftw_destroy_plan((fftw_plan_s*) r2Fplan); 
       fftw_destroy_plan((fftw_plan_s*) F2rplan); 
      } 
     } 
    } 

回答

0

對於單精度(float),你需要將libfftwf庫鏈接,雙精度(double),你需要的libfftw庫。我想你只是把後者連接起來而不是前者。對於gcc等,如果你想要雙精度和單精度的支持,命令行需要包含-lfftw3 -lfftw3f

+0

感謝您的回答,我嘗試以不同方式鏈接fftw庫。 -lfftw3l -lfftw3f和當前一個-lfftw3,打印相同的錯誤。 – user1532868

+1

這仍然是錯誤的,如果你想要雙精度和單精度,它需要是'-lfftw3 -lfftw3f'。 –

+0

是的,我測試了他們,同樣的錯誤。 – user1532868