8

Fortran 90模塊是eva逝的生物。我一直在使用(奇異)模塊,取得了一些成功(使用英特爾Visual Fortran和Visual Studio 2010進行編譯)。然後,我寫了另一個模塊,並試圖利用它在另一個功能,收到此錯誤之前:Fortran 90模塊的神祕性質

error #7002: Error in opening the compiled module file. Check INCLUDE paths. 

所以我刪除有問題的模塊。但是現在當我嘗試訪問我的原始模塊時,我收到了同樣的錯誤!

我怎樣才能找到這些神祕的生物?爲什麼一個模塊工作,但不是兩個?我假設我需要刪除並重新編譯它們,或者告訴編譯器以某種方式包含它們。我知道源代碼的文件位置但不他們編譯爲

回答

27

對於特定的處理器(許多其它的Fortran處理器具有相似的特性,但在細節上有所不同):

  • 當一個模塊成功編譯,編譯器生成一個mod文件(以及可能的.OBJ文件),其中包含有關該模塊提供的實體的信息。正是這個mod文件引用了你引用的錯誤信息。編譯器在編譯其他源代碼時遇到該模塊的USE語句時需要此mod文件。 (obj文件用於鏈接階段。)

  • 因此,在使用模塊之前,編譯器必須在某個時間編譯模塊的源代碼。這意味着模塊的源代碼(MODULE ... END MODULE)必須早於USE語句之前的源文件出現,或者必須位於使用USE語句在源文件之前編譯的單獨文件中。

  • 在Visual Studio中使用英特爾Fortran項目編譯時,構建環境將自動嘗試爲項目中的源文件安排合適的編譯順序。當使用命令行中的ifort命令進行編譯時,程序員負責管理編譯順序。

  • 接收生成的mod文件的目錄由給予編譯器的第一個/ module命令行選項指定。在Visual Studio中,使用Fortran> Output Files> Module Path屬性設置此選項。默認情況下,在Visual Studio Fortran的項目有此屬性設置爲當前配置的名稱,因此國防部文件出現在所謂的調試或發佈該項目的子目錄。在沒有/ module命令行選項的情況下,mod文件出現在當前目錄中。

  • /module命令行選項指定的目錄(或等效的Visual Studio屬性)也用於搜索mod文件。另外,搜索/ I命令行選項(在Visual Studio,Fortran> General> Additional Include Directories中)指定的目錄。

它不是從你的問題清楚你如何分配你的模塊之間的源文件,你是否有一個單一的Visual Studio項目或多個項目等,如果你只用一個單一的項目,然後處理通常所需要的只是將所有Fortran文件添加到項目的源文件中,並且默認設置應該「有效」。找到mod文件的錯誤可能是因爲:

  • 該模塊的關聯源不在該項目的源文件之一中;

  • 編譯源失敗某些其他原因模塊的(是早前在構建順序列出的其他錯誤?)

  • 一個模塊,它在一個特定的源文件使用後定義;

  • 模塊之間存在循環依賴關係(模塊A使用模塊B使用A或類似語言 - 這是語言規則所不允許的);

  • 某些源構造混淆了構建順序的自動確定(構建系統的舊版本被F2003使用語句形式與雙冒號混淆,此外還可能混淆USE語句,使構建系統未能識別它們),但這些方面相當模糊。

在Visual Studio多個Fortran的項目有可能需要修改的模塊搜索目錄的相關項目,使得它們能夠找到項目的依賴關係樹以前的項目編制的MOD文件。如果Visual Studio中的項目間依賴關係設置是正確的,則英特爾Fortran的更高版本也會自動處理此方面。

+4

+1對於一個非常模糊的問題,出色而詳細的答案。 – Chris

+0

謝謝你的出色答案。您向我提供了關於模塊如何在Visual Studio環境中工作的深入見解。感謝你,我現在有多個模塊可以正常工作!我很感激你花時間寫出這個解釋。 – frostbyyte