首页 > 解决方案 > 如何在 Windows 上静态链接 FFTW?

问题描述

在我的项目设置过程中 - 当我对 cmake 的了解甚至比现在还少时 - 我正在尽最大努力链接 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

标签: c++windowscmakelinkerstatic-linking

解决方案


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

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

编辑:审查时,您的问题与此问题几乎相同,答案相同。


推荐阅读