【问题标题】:Can't link to fftw library using visual C++ express on windows 64 bit无法在 Windows 64 位上使用 Visual C++ Express 链接到 fftw 库
【发布时间】:2017-02-10 02:14:16
【问题描述】:

我正在尝试使用 Visual c++ express 链接到 fftw 库,但是当我尝试编译时出现链接器错误。我生成了 lib 文件,正如网站 (http://fftw.org/install/windows.html) 通过使用 lib.exe 程序创建 .lib“导入库”来解释的。

我将 .lib 文件添加到“Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib”,并将 fftw3.h 添加到“Program Files (x86)\Microsoft Visual Studio 9.0\VC\include”。然后我将 dll 文件放在“Windows/system32”文件夹中。我通过将库(libfftw3f-3.lib、libfftw3-3.lib、libfftw3l-3.lib)添加到链接器/输入首选项的其他依赖项来链接这些库。当我尝试编译时,出现以下错误:

    process_wav.obj : error LNK2019: unresolved external symbol __imp__fftwf_destroy_plan referenced in function _main
    process_wav.obj : error LNK2019: unresolved external symbol __imp__fftwf_plan_dft_r2c_1d referenced in function _main

我搜索了堆栈溢出,但大多数答案都说明需要将库添加到要找到的其他依赖项中。当我将 /verbose:lib 放在命令行选项上时,我得到以下信息:

    f
    fdf

1>Linking...
1>Searching libraries
1>    Searching libfftw3f-3.lib:
1>    Searching libfftw3-3.lib:
1>    Searching libfftw3l-3.lib:
1>    Searching F:\Program Files\Mega-Nerd\libsndfile-win32-bin-1.1.7\libsndfile-1.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbc32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbccp32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\winspool.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\comdlg32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\advapi32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\shell32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\ole32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\oleaut32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\MSVCRTD.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\msvcprtd.lib:
1>    Searching libfftw3f-3.lib:
1>    Searching libfftw3-3.lib:
1>    Searching libfftw3l-3.lib:
1>    Searching F:\Program Files\Mega-Nerd\libsndfile-win32-bin-1.1.7\libsndfile-1.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbc32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbccp32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\winspool.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\comdlg32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\advapi32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\shell32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\ole32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\oleaut32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\MSVCRTD.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
1>    Searching F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\msvcprtd.lib:
1>    Searching libfftw3f-3.lib:
1>    Searching libfftw3-3.lib:
1>    Searching libfftw3l-3.lib:
1>    Searching F:\Program Files\Mega-Nerd\libsndfile-win32-bin-1.1.7\libsndfile-1.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbc32.lib:
1>    Searching F:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\odbccp32.lib:
1>Finished searching libraries

它似乎找到了库,但不知道在其中找到函数名称的人。我从一个也使用这个库的网站上得到了代码,有趣的是函数名没有出现在“fftw3.h”中,但我认为这不是问题的原因。

任何帮助将不胜感激,因为我现在不知道该去哪里。

谢谢。

【问题讨论】:

  • 您必须编辑了 fftw3.h 头文件,以便使用 __declspec(dllimport)。 .h 文件建议在“烦人的 Windows 语法”注释之后这样做。这实际上不是正确的做法,预编译的 DLL 不会导出入口点的 __imp 版本。
  • 感谢汉斯回复我。抱歉回复晚了,我尝试删除 __declspec(dllimport) 并最终得到很多缺少类型说明符的错误。我尝试使用下面建议的 32 位库,并且暂时使用它。我不知道为什么我使用 64 位版本时找不到函数名。

标签: windows visual-c++ fftw


【解决方案1】:

以下步骤适用于 Visual Studio 2008(来自 http://itkcorner.blogspot.com/2012/01/inclusion-de-fftw-en-visual-studio-2008.html);

  1. 从 fftw org 网站 (http://www.fftw.org/install/windows.html) 下载文件“fftw-3.3dll32.zip”

  2. 为了从 Visual C++ 链接到这些 .dll 文件,您需要为它们创建 .lib“导入库”,并且可以使用 VC++ 附带的“lib”命令来实现。特别是,运行: lib /def:libfftw3-3.def

在“工具 > Visual Studio 2008 命令提示符”中,无需打开任何项目,只需 Visual。进入控制台后,使用“cd”命令进入文件夹所在的根目录,然后运行上面的三行代码,然后创建“lib 文件”。

  1. 复制创建库的文件夹,然后将其复制到我们要使用它的项目文件夹中,并将文件夹重命名为“FFTW_LIBS”。在此文件夹中,必要的文件是具有“.dll”、“.lib”和“fftw3.h”的文件。

  2. 在项目中包含库:“项目 > 属性 > 配置属性 > 链接器 > 条目 > 附加依赖项”,然后我们包含三个新的库文件:

libfftw3-3.lib

  1. 包含库所在的路径: 一个。 “Project > Properties > Configuration Properties > Linker > General > Additional libs directory”,我们在那里写“./FFTW_LIBS”。 湾。 “项目 > 属性 > 配置属性 > 净化 > 环境”,我们在那里写“./FFTW_LIBS”。

  2. 包含“.dll”文件所在的路径。在“项目 > 属性 > 配置属性 > 净化 > 环境”中。在变量“环境”中,我们必须指定文件“libfftw3-3.dll”的位置,我们写“PATH = .\FFTW_LIBS” 完成所有这些步骤后,您只需添加“#include fftw3.h”并使用 fftw 函数!

【讨论】:

  • 感谢 Antonio,我使用 32 位版本的库进行了尝试,效果很好。我不确定我在尝试 64 位版本时出了什么问题,但我现在会继续这样做。
【解决方案2】:

我将对 Antonio 的步骤稍作修改:

以下在 Windwos 10、Visual Studio 2017、32 位应用程序、x64 计算机上为我工作:

  1. 下载预编译的 FFTW 3.3.5 Windows DLL 并解压缩 .zip 文件

    http://www.fftw.org/install/windows.html

  2. 打开 VS 2017 RC 的开发者 cmd 提示符并转到提取的 文件夹

  3. 如下运行lib应用程序以创建导入库 (.lib 文件)来自 .dll 库:

       lib /def:libfftw3-3.def
    
       lib /def:libfftw3f-3.def 
    
       lib /def:libfftw3l-3.def
    
  4. 将以下文件复制到一个新文件夹中,将该新文件夹命名为 fftw_lib

           fftw3.h
           libfftw3-3.lib
           libfftw3f-3.lib
           libfftw3l-3.lib
           libfftw3-3.dll
           libfftw3f-3.dll
           libfftw3l-3.dll
    
  5. 将“fftw_lib”文件夹复制到项目文件夹中

  6. 告诉链接器在您的项目中包含 .lib 文件:

项目>属性>配置属性>链接器>条目>附加依赖=

       libfftw3-3.lib
       libfftw3f-3.lib
       libfftw3l-3.lib
  1. 将库的路径添加到链接器和编译器:

项目>属性>配置属性>链接器>常规>附加库目录=

C:\Users\用户名\Documents\Visual Studio 2017\Projects\MP_2\MP_2\fftw_lib

项目>属性>配置属性>C/C++>常规>附加包含目录=

C:\Users\用户名\Documents\Visual Studio 2017\Projects\MP_2\MP_2\fftw_lib

  1. 包括 dll 库所在的路径:

项目>属性>配置属性>调试>环境=

PATH=C:\Users\Username\Documents\Visual Studio 2017\Projects\MP_2\MP_2\fftw_lib

结束!

【讨论】:

  • 2020,使用 Microsoft Visual Studio 2017 社区版,Additional DependenciesProject > Properties > Configuration Properties > Linker > Input > Additional Dependencies 下。在文本框中,提供每个 .lib 的完整路径,以 CRLF 分隔
【解决方案3】:

也许在运行时它会询问您是否缺少 fftw dll。
我拿到了那个箱子,只是把它们放到了 system32 文件夹中。

【讨论】:

    【解决方案4】:

    我在 64 位 Windows 7 上使用 Visual Studio 2013 Express,在尝试为 x64 构建时遇到了与您相同的问题。问题是我使用“VS2013 的开发人员命令提示符”shell 中的lib.exe 生成了.lib.exp。当我从“VS2013 x64 Cross Tools Command Prompt”shell 重新生成 .lib.exp 时,所有引用都已解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多