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(){ ofstream savefile; fftw_plan my_plan; my_plan = fftw_plan_dft_1d(length,signal,fftsignal,FFTW_FORWARD,FFTW_ESTIMATE); fftw_execute(my_plan); |
我用来编译的命令是:
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
|
如果有人知道如何正确链接到这些库或发现我的链接不起作用的原因,我感谢您的帮助。
谢谢。
- 请显示 ..filepath..\”FFTW learning” 的内容,以便我们帮助您构建正确的命令行。
- 感谢您的回复。我在我大学的服务器系统上,所以文件路径有点奇怪,但它是:\\\\\\\\\\\\\\\\tawe_dfs\\\\\\\\students\\\\\\\\1\\\\\\\\1915821\\\\\\\\Desktop \\\\”C 程序”\\\\”FFTW 学习”
- 我还意识到我忘记在上述编译命令中的 FFTW.cpp 命令之前包含 -std=c 11 。
- 我的意思是”那里有什么文件”。
- 没错,当然。这是文件夹内容屏幕截图的链接。 i.stack.imgur.com/qUxS5.png
- 所以 -llibfftw3-3 ?
- 感谢所有的回复,我尝试使用 -llibfftw3-3 得到错误 “cannont find -llibfftw3-3” 和 -Llibfftw3-3 列出的原始错误说有未定义的引用和最后一个链接失败了。
- -L 告诉链接器在哪里搜索。 -L 告诉链接器要链接什么。所以你应该添加 -L..filepath..\”FFTW learning” -lllibfftw3-3 你也可以只使用 -L. 指向当前目录。
- 感谢Botje的帮助,我自己偶然发现了这一点。
由于它在 Windows 上,我怀疑 fftw 是作为 .lib 文件提供的。在这种情况下,您不能只使用 -l(仅适用于 .a 和 .so 文件),您需要使用 -llibfftw3。这是对惯例的偏离,但 Mingw 也是这么说的。
- 感谢您的回复,我已尝试使用 -llibfftw3、-llibfftw3-3、-llibfftwl3-3 和 -llibbfftwf3-3。 .zip 文件中包含的所有 .dll 文件。所有这些都会产生相同的错误。 FFTW 提供的 .zip 中没有 .lib 文件。
我把我的链接目录命令和库名命令弄错了。正确的 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 命令指定了库名。
感谢所有帮助。
- 请参阅我上面关于 -L. 的评论。 -I. 的工作原理类似。如果您超出了单个 .cpp 文件的范围,请考虑编写一个 Makefile 将它们捆绑在一起并节省您的手腕。
来源:https://www.codenong.com/59289435/