如何在 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(因为他们提供的只是动态库(.dll
s)。如果你看一下文件大小在 .lib
文件中,它非常小,因为它只是对 .dll
s.
的引用
按照 FFTW 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(因为他们提供的只是动态库(.dll
s)。如果你看一下文件大小在 .lib
文件中,它非常小,因为它只是对 .dll
s.
按照 FFTW windows 页面上的说明从源构建库。因为您现在正在自己构建库,所以您可以选择关闭“共享库”并创建一个“静态”库。