簡體   English   中英

如何在 windows 上靜態鏈接 FFTW?

[英]How do I statically link FFTW on windows?

在我的項目設置期間 - 當我對 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文件——即使這是共享/動態鏈接,而不是 static 鏈接。


我現在正在嘗試正確靜態鏈接庫; 我從我的構建文件夾中刪除了 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 以使可執行文件運行(它仍然是動態鏈接)。


(成功)詳細構建 output: https://pastebin.com/bbrZdd7r

您從 DEF 文件生成的 LIB 文件是“存根”。 它們包含足夠的代碼來加載 DLL 並從中調用函數。 它們不包含實際的 FFTW 代碼。 您不能與這些預構建的 FFTW LIB 進行靜態鏈接。

您需要先自己將 FFTW 編譯成 static 庫。 它帶有一個CMake構建文件,您可以在其中關閉BUILD_SHARED_LIBS

編輯:審查時,您的問題與問題幾乎相同,答案相同。

libs可以是 static 或動態庫。 生成的(按照README-WINDOWS文件中的說明)是共享的(它們鏈接到同一文件夾內的.dll文件。

使用 FFTW 提供的 windows 二進制文件,您無法靜態鏈接(因為它們提供的只是動態庫( .dll s)。如果您查看.lib文件的文件大小,它非常小,因為它只是對.dll s。

按照 FFTW 的 windows 頁面上的說明從源代碼構建庫。 因為您現在正在自己構建庫,所以您可以選擇打開“共享庫”並創建一個“靜態”庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM