【发布时间】:2015-06-01 17:32:11
【问题描述】:
我正在尝试使用 MinGW 将 Linux 项目编译到 Windows 中。我用 Cygwin 成功地做到了这一点,但我更喜欢使用 MinGW,所以我的程序最终不会有几十个不必要的依赖项。
不幸的是,我遇到了编译器抱怨对文件的未识别引用的问题。我正在为 Windows 使用 FFTW3 的预编译版本,并使用 dlltool 创建 .a 文件以将其链接到 MinGW。我已经为编译器指定了libpath,但不幸的是,我仍然遇到错误。
这是我的输出:
make all
gcc -I../Include -L..\Lib -Wall -O3 -o lvdoenc lvdoenc.o lvdomain.o -I../Include -L..\Lib -m32
lvdoenc.o:lvdoenc.c:(.text+0x29b): undefined reference to _imp__fftw_execute'
lvdoenc.o:lvdoenc.c:(.text+0x608): undefined reference to_imp__fftw_malloc'
lvdoenc.o:lvdoenc.c:(.text+0x647): undefined reference to _imp__fftw_plan_r2r_2d'
lvdoenc.o:lvdoenc.c:(.text+0x8d1): undefined reference to_imp__fftw_free'
lvdoenc.o:lvdoenc.c:(.text+0x8e5): undefined reference to _imp__fftw_destroy_plan'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: lvdoenc.o: bad reloc address 0x20 in section.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
make: *** [lvdoenc] Error 1
13:23:28 Build Finished (took 217ms)
我遇到的所有解决方案都涉及使用 gcc 编译以链接 fftw3 (-lfftw3),但这在 MinGW 中不起作用。我在 Cygwin 中遇到了同样的问题,但是使用 -lfftw3 作为编译器选项的解决方案确实有效。我什至指定了 lib 路径的位置。包含路径工作正常,但在 libpath 中找不到库。
任何帮助将不胜感激。
【问题讨论】:
-
-lfftw3必须给出,否则链接器将无法解析该库中的符号。您应该添加使用-lfftw3编译时不起作用的内容。我刚刚下载了 dll,使用了dlltool并尝试将 fftw3-library 的符号与 MinGW 链接,并且成功了。 -
MinGW 的 gcc 或链接器是否知道如何处理 Windows 样式的路径?因为这就是你给它喂的东西(
..**\**Lib)。此外,您还传递了两次包含和 lib 路径。 -
好的,所以我使用了 Windows 编译的二进制文件,只是通过将其更改为 -lfftw3-3 来识别它,它仍然没有正确链接。我认为它可以处理 Windows 样式的路径,因为包含路径的编写方式相同,并且工作正常。 @4566976 真的吗?你从哪里得到的dll?我试过他们的网站,图书馆不会链接。我正在使用 Eclipse 作为我的 IDE。有趣的是,有些符号确实可以正确链接,但有些则不然。
-
@4566976 我刚刚了解到一些库的分布实际上缺少某些符号。你是从哪里下载这些 Dll 的?
-
@Skylion:我是从here 下载的。
dlltool -d libfftw3-3.def -l libfftw3.aint main() { fftw_malloc(); }gcc x.c -L.\. -lfftw3