【问题标题】:How do I statically link FFTW on windows?如何在 Windows 上静态链接 FFTW?
【发布时间】:2020-07-15 02:03:33
【问题描述】:

在我的项目设置期间 - 当我对 cmake 的了解甚至比现在还少时 - 我是 trying my hardest 来链接 FFTW 库。

C:\\path\\to\\fftw-3.3.5-dll64 包含.h 文件、.lib 文件(从.def 文件生成)和.dll 文件。

我最终将这些链接添加到我的CMakeLists.txt

add_executable(${TargetName} PRIVATE main.cpp)
target_include_directories(${TargetName} PRIVATE "C:\\path\\to\\fftw-3.3.5-dll64")
target_link_directories(${TargetName} PRIVATE "C:\\path\\to\\fftw-3.3.5-dll64")
target_link_libraries(${TargetName} PRIVATE libfftwf3-3)

构建后,应用程序仍然无法正常工作。最终,我发现在打开可执行文件时,windows 正在寻找 libfftw3-3 dll 文件。当时我只是想让它工作,所以我复制了库中包含的.dll 文件——即使这是共享/动态链接,而不是静态链接。


我现在正在尝试正确地静态链接库;我从构建文件夹中删除了 dll,并将我的 CMakeLists.txt 文件过滤为:

add_executable(${TargetName} PRIVATE main.cpp)
target_include_directories(${TargetName} PRIVATE "C:\\path\\to\\fftw-3.3.5-dll64")
target_link_libraries(${TargetName} PRIVATE libfftwf3-3)

正如我所期望的那样,它会构建。然而,即使在我的CMakeLists.txt 文件中,我已经采取了静态链接库的步骤,我仍然需要复制 dll 以使可执行文件运行(它仍然是动态链接)。


(成功)详细构建输出:https://pastebin.com/bbrZdd7r

【问题讨论】:

  • 你能显示详细链接命令的输出吗?
  • @squareskittles 我不明白你的意思
  • 编译可执行文件时,通常会打印一些日志。将这些包含在您的问题帖子中会很有帮助。你的编译器是什么?应该有一种方法可以显示更详细的编译/链接输出,以便此日志打印有助于解决问题的其他信息。
  • @squareskittles MSVC 1926(使用忍者)。我将添加构建输出(它通过了)
  • 要获得详细的链接器输出,您可以尝试运行ninja -v 以提供额外的详细信息。这将显示 哪个 库实际上正在被链接。

标签: c++ windows cmake linker static-linking


【解决方案1】:

您从 DEF 文件生成的 LIB 文件是“存根”。它们包含足够的代码来加载 DLL 并从中调用函数。它们不包含实际的 FFTW 代码。您不能与这些预构建的 FFTW LIB 进行静态链接。

您需要先自己将 FFTW 编译成静态库。它带有一个CMake 构建文件,您可以在其中关闭BUILD_SHARED_LIBS

编辑:经过审核,您的问题与this one 几乎相同,答案相同。

【讨论】:

  • 我很欣赏这个答案,但这是不正确的。您链接的存储库是供贡献者使用的(它不包含整个源代码 - 自动生成的 C 代码)。存储库自述文件使大多数人不应该使用它。您实际上需要做的是从网站下载源代码.tar.gz。然后他们提供 bash 脚本BUILD-MINGW32/64.sh 用于在 windows 上构建(这是他们用来生成为 windows 提供的 dll 的脚本)。要使用此脚本,安装 MINGW 最简单,使用 gccmake
  • 我特意链接了 CMake 文件(它是跨平台的)来说明如何构建它。您确实应该从他们的网站获取源 tarball,并可以使用 CMake 构建它。
  • 那么,您是说可以将BUILD-MINGW64.sh 脚本与这个cmake 项目互换?这对我来说没有意义,因为它们有 2 个不同的来源
  • 另外,我同意这个问题实际上与您链接的问题相同。我昨天实际上在那里找到了答案。不过这个更清楚。
  • 最好提出一个新问题,说明您是如何编译 fftw 以及如何尝试链接它的。
【解决方案2】:

libs 可以是静态的也可以是动态的。生成的(按照README-WINDOWS 文件中的说明)是共享的(它们链接到同一文件夹内的.dll 文件。

使用 FFTW 提供的 windows 二进制文件,您无法静态链接(因为它们提供的只是动态库 (.dlls)。如果您查看 .lib 文件的文件大小,它非常小,因为这只是对.dlls 的引用。

按照 FFTW 窗口页面上的说明,从源代码构建库。因为您现在正在自己构建库,所以您可以选择关闭“共享库”并创建一个“静态”库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多