如何在 windows 上静态 link FFTW?

How do I statically link FFTW on windows?

在我的项目设置期间 - 当我对 cmake 的了解比现在还少时 - 我是 trying my hardest 到 link FFTW 库。

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

我最后做的是将这些 link 添加到我的 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 文件 - 尽管这是 shared/dynamic linking,而不是静态的 linking.


我现在正在尝试正确地静态 link 库;我从我的构建文件夹中删除了 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 文件中,我已经采取了静态 link 库的步骤,我仍然需要复制 dll 以便将可执行文件 运行(动态 link 仍然)。


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

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

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

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

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

使用FFTW提供的windows二进制文件,你不能静态地link(因为他们提供的只是动态库(.dlls)。如果你看一下文件大小在 .lib 文件中,它非常小,因为它只是对 .dlls.

的引用

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