FFTW 库,未定义对“fftwf_*”的引用

fftw library, undefined reference to `fftwf_*'

提问人:user1532868 提问时间:1/13/2015 最后编辑:user35443user1532868 更新时间:1/13/2015 访问量:8310

问:

嗯,这是我遇到的一个非常奇怪的错误。

当我尝试通过以下命令使用 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);
            }
        }
    }
C++11 FFTW

评论


答:

3赞 Paul R 1/13/2015 #1

对于单精度 (),您需要链接库,对于双精度 (),您需要链接库。我猜你只是链接了后者,而不是前者。对于 gcc 等,如果您同时需要双精度和单精度支持,则需要包含命令行。floatlibfftwfdoublelibfftw-lfftw3 -lfftw3f

评论

0赞 user1532868 1/13/2015
感谢您的回答,我尝试以不同的方式链接 fftw 库。-lfftw3l -lfftw3f 和当前的 -lfftw3,打印相同的错误。
1赞 Paul R 1/13/2015
这仍然是错误的,如果你想要双精度和单精度,就需要它。-lfftw3 -lfftw3f
0赞 Paul R 1/13/2015
好的 - 这可能是一些简单的东西,从上面的代码中并不明显 - 我认为你只需要使用分而治之的方法,直到你确定问题所在。
0赞 user1532868 1/13/2015
谢谢,我正在做。只需要很长时间来测试整个文件(~1000行)
3赞 user1532868 1/13/2015
现在没问题了!,我需要添加所有参数,-lfftw3、-lfftw3f、-lfftw3l。我真傻!