2016-02-20 82 views
1

我正在嘗試使用Visual Studio 2015來編譯使用FFTW的項目。不幸的是,由於這個問題,FFTW網站預編譯的二進制文件與VS 2015不兼容:unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2。當您嘗試編譯時會出現鏈接錯誤。在Visual Studio 2015中使用FFTW

我正在尋找關於如何編譯兼容版本的任何建議。顯而易見的答案是使用VS 2015重新編譯FFTW,但是我找不到有關如何使用Visual Studio進行編譯的任何說明,以及很多建議,很難做到這一點。標準版本是用MinGW編譯的,他們確實提供瞭如何做到這一點的說明。但是MinGW可以生產一個兼容VS 2015的庫嗎?我還沒有找到任何有關這方面的信息。

回答

1

我終於設法弄清楚了這一點。我不保證我以最好的方式做到了這一點,因爲我不是Visual Studio專家,但它確實有效。所以爲了後人的利益,這就是我所做的。

首先,複製config.h.in。調用新的副本config.h。現在手動編輯它來爲要生成的庫設置選項:它應該使用哪種精度模式,要編譯哪個向量指令集(如果有的話),各種類型的大小(這取決於您是否計劃以32位或64位模式編譯),是否包含線程支持等。

現在創建一個空的VS項目。我建議將它放在源文件夾的頂層。然後在解決方案資源管理器中,單擊頂部的「顯示所有文件」圖標。這將使以下步驟更容易,因爲您可以直接從解決方案資源管理器添加或排除文件。

調出項目屬性窗口。有很多選項需要設置:

通常,將「配置類型」設置爲靜態庫。 (或者你可以將它設置爲動態庫,如果你需要一個DLL,但是你需要弄清楚如何讓它導出必要的符號。我沒有那樣做,因爲我想要一個靜態庫。)

在VC++目錄中,編輯「包含目錄」。

(source dir) 
(source dir)\api 
(source dir)\dft 
(source dir)\rdft 
(source dir)\reodft 
(source dir)\kernel 
(source dir)\simd-support 
(source dir)\dft\simd 
(source dir)\dft\scalar 
(source dir)\rdft\simd 
(source dir)\rdft\scalar 

如果你包括線程支持,然後在C/C++>語言,設置「打開MP支持」:(由包含源的實際目錄替換「(源代碼目錄)」)將以下目錄添加是的。

如果你包括AVX支持,那麼在C/C++>代碼生成,設置了「啓用增強指令集」到AVX。這意味着您生成的庫不適用於任何不支持AVX的計算機。您只需在使用AVX的各個源文件上設置此選項即可解決此限制。對此我不確定。

在C/C++>輸出文件中,設置 「對象文件名」 到$(IntDir)/%(RelativeDir)/。 (FFTW有很多文件名稱相同,但目錄不同,默認情況下VS將所有目標文件放在同一個目錄中,這將不起作用。)

現在您已準備好將源文件添加到該項目可以通過右鍵單擊解決方案資源管理器並選擇「包含在項目中」來完成。您應該添加的所有.c文件在以下文件夾:

api 
dft 
dft/scalar 
kernel 
rdft 
rdft/scalar 
reodft 

如果你想線程支持,你應該加入「線程」 除了爲threads.c所有的源文件。 (那個包含pthreads版本。)

如果您想爲任何向量指令集的支持,你應該只包括與該特定指令的文件集,而從下列文件夾想:

dft/simd 
rdft/simd 
simd-support 

據推測,如果你想MPI支持,包括「mpi」中的文件。我沒有那樣做,所以我不知道是否還有其他工作需要完成。

一定要將配置設置爲「發佈」和「x86」或「x64」,具體取決於您想要的二進制類型。

現在,如果我沒有忘記任何關鍵的東西,你應該可以編譯一個庫。

+0

感謝您花時間概述您的解決方案。我也被困在與VS 2015的兼容性上,它似乎不是一個流行的問題。 – benrules2