1. 程式人生 > >Fortran含Module情況下Makefile檔案書寫

Fortran含Module情況下Makefile檔案書寫

轉載於: http://blog.sina.com.cn/s/blog_59cf67260100kzat.html

2012年10月11日補充: Linux下用makefile編譯含module的fortran原始碼時,第一次make會生成一個modulename.mod的檔案,但同時會提示說找不到mod檔案: Fatal Error: Can'topen module file 'xxxx.mod' for reading at(1):沒有那個檔案或目錄 解決這個問題的最簡單的方法其實是:再make一遍! 另外一種就是:想辦法把含module的檔案先編譯,比如說修改檔名命名,或者特殊地寫出來! 原來一直用inlude來把很多檔案包含在一個檔案裡,一直很想寫Makefile來搞定這件事,今天終於搞定。沒想到makefile還挺麻煩,不過很高興地是自己採用一種特殊的辦法,解決了含Module的檔案的編譯,而且是比較簡單而通用的,對有很多含Module的檔案同樣適用。 解決方法: 1.把含Module的檔案命名為.module檔案,且module名字和檔名相同,一個檔案裡只寫一個Module。 2.編譯時要用-x f95來說明它是fortran95格式,而編譯其它檔案f90檔案到.o目標檔案時,只編譯依賴的f90檔案(不然會有warning,反正我不喜歡有這個東西) 特此發博文記錄下(注意紅色部分):
#Compiler and Compile options FC=gfortran CFLAGS = -O2 #Source code files, Object files and Target(Executable) filedefine SRCS = $(wildcard *.f90) OBJS = $(SRCS:.f90=.o) TARGET = api MODSRCS = $(wildcard*.module)
MODOBJS =$(MODSRCS:.module=.o) MODS =$(MODSRCS:.module=.mod) #Debug purpose. #all: # @echo $(SRCS) # @echo $(MODOBJS) #Generate Target file using Object files $(TARGET): $(OBJS) $(MODOBJS) $(FC) $(CFLAGS) $^ -o [email protected] #Generate Object files using Source code files %.o: %.f90 $(MODS)
$(FC) $(CFLAGS) -c $< $(MODS) $(MODOBJS):$(MODSRCS) $(FC) $(CFLAGS) -x f95 -c$^ ##Use "make run" can run the Target file run: @./$(TARGET) #Clean the Object files clean: rm $(OBJS) $(MODOBJS) $(wildcard *.mod) #Clean both the Object files and Target file clean-all: rm $(TARGET) $(OBJS) $(MODOBJS) $(wildcard *.mod) (如果你要複製上面的程式碼,記得把編譯規則(:的下一行)前面的加Tab
) 中間用到萬用字元,變數,搜尋一類檔案的功能,還有變數替換。  %.o: %.module以及%.o:%.module比較省事,或以把一類目標檔案從其依賴的檔案型別按定義的規則進行編譯。  $(wildcard *.c) 所有當前目錄下的.c結尾的檔案  變數替換嘛,可以用patsubst,substs以及我用到的":=",初次接觸,不大會用,所以有中間的debug,輸出變數看是不是對的。 Makefile我目前瞭解的一個好處就是:檔案很多時,不用每次都去編譯所有的檔案(本來我都是用include包含在一個檔案裡)。 題外話:Fortran中有Module,make的時候老有錯,說Module沒定義,我不知道這個原因該是怎麼的。把Module的檔案單獨寫出來,進行編譯,可是這樣還是不行,很多module的時候也很麻煩。我們把依賴的mod寫出來,發現它實際上在編譯成目標檔案的時候又用不到。關鍵似乎是要有.mod的檔案,知道這個.o檔案依賴於哪個.mod檔案。我乾脆把含module的f90檔案改成以.module結尾了,不過這樣編譯時要用-xf95來說明它是fortran95檔案,而編譯其它檔案f90檔案到.o目標檔案時,只編譯依賴的f90檔案(全編譯卻有warning說:.mod檔案沒用到,因為沒有進行連結!)。哈哈,解決了含Module檔案的編譯問題!  缺點: 1.名字必須和檔案中的module名字一樣,還每一個檔案中只能有一個module。 2.要是幾百個這樣的含Module的檔案,它們原來的名字都是f90,那還得用指令碼自己改了,還是麻煩。 邏輯有點扯:編譯成目標檔案的時候似乎不需要.mod,但是又要知道它依賴於哪個.mod檔案以及這個.mod檔案怎麼編譯。而我們在Target依賴的檔案$(MODOBJS),卻可以不必要知道它怎麼編譯…… 不明白,為什麼fortran的module要先生成一個.mod檔案,為什麼不直接寫在.o檔案裡? 大家都在說Gfortran編譯的程式執行效率不高,哪天應該測試一下。

相關推薦

FortranModule情況Makefile檔案書寫

轉載於: http://blog.sina.com.cn/s/blog_59cf67260100kzat.html 2012年10月11日補充: Linux下用makefile編譯含module的fortran原始碼時,第一次make會生成一個modulename.mo

不刪除資料情況轉換檔案系統型別,從FAT32轉到NTFS

轉換檔案系統型別,從FAT32轉到NTFS(不刪除資料) 如果是從NTFS轉FAT32就不能用下面的方法,需要備份你的資料之後再格式化 最近下完電影想把電影傳到U盤裡,結果顯示檔案過大不能傳,然後看了看我的U盤屬性是FAT32,FAT32是不支援4G以上的檔案傳輸的,所以需要改變

LinuxMakefile檔案常用知識總結

1.Makefile檔案命令的使用 一般有兩種用法 #1 make #2 make command 第一種用法會自動執行Makefile中的所有指令,第二種用法會執行Makefile中的指定指令。 2.Makefile檔案命令的一般寫法 目標: 依賴項1 依賴項2

檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況,如何獲取表單提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

如何在不重啟 JVM 的情況重新載入證書檔案

某種情況下需要動態下載證書檔案後使用 SSL 訪問某服務,但由於 JVM 使用預設的證書訪問新服務,該證書在 JVM 啟動的時候載入,那時還沒有新服務的證書,所以會報 ValidatorException,詳情: 16:44:27,338 ERROR [Htt

JAVA在不基於XML配置檔案情況實現郵件傳送功能(郵箱轟炸)

    今天要講的是如何用Java程式碼實現簡單郵件傳送和複雜郵件傳送的功能,這裡我使用的是QQ郵箱,你們也可以嘗試使用其他的郵箱哦~ 想實現郵件傳送功能首先郵箱賬號必須要開啟 SMTP 服務,在網頁登入郵箱後點擊設定→賬戶然後下拉,如圖 &nb

angular: 程式碼正確的情況npm不斷提示 TS2307: Cannot find module XXX , TS2305: Module XXX has no exported member

探索angular. 照搬示例模組,添加了自定義的模組,名稱為device,程式碼全部正確,VSCode沒有報錯,但是npm啟動時各種報錯: 主要是TS2307: Cannot find module、TS2305: Module XXX has no exported membe

上傳檔案到伺服器解壓並執行(在ssh斷開的情況程式仍然執行)

上一篇中記錄了伺服器上tensorflow等環境的搭建,這篇文章,記錄在伺服器上執行專案。 一、本地上傳檔案到伺服器 哎,上傳檔案,我用了scp命令,rz等最後都以失敗告終,因為我的伺服器需要在校園網的環境下,然後用了vpn連校園網,但是可能上傳檔案時可能不走vpn吧,然後總是顯示連線不上,

資料檔案還在的情況 進行資料庫恢復

今天在為windows作業系統恢復資料時,碰到了如圖問題 此時我已經通過源庫的spfile生成了pfile,並修改過pfile裡的相關路徑, 將資料庫啟到mount狀態了 。 原因: 根據報錯可以看出,資料檔案的目錄不對,通過 select name from v$d

Linux環境使用VSCode編譯makefile檔案的注意事項

Linux環境下使用VSCode編譯makefile檔案的注意事項 首先安裝C/C++的兩個依賴   在debug,launch會自動的生成下方的launch.json     launch.json { // Use IntelliSense to l

在不解壓縮的情況修改壓縮包內的檔案

 FileSystem fileSystem;             try {                 fileSystem = FileSystems.newFileSystem(path2File.toPath(), null);//path2File是壓縮包

如何在不會導致伺服器宕機的情況,用 PHP 讀取大檔案

作為PHP開發人員,我們並不經常需要擔心記憶體管理。PHP 引擎在我們背後做了很好的清理工作,短期執行上下文的 Web 伺服器模型意味著即使是最潦草的程式碼也不會造成持久的影響。 很少情況下我們可能需要走出這個舒適的地方 ——比如當我們試圖在一個大型專案上執行 Co

在不root手機的情況讀取data目錄檔案

使用 adb shell 指令可以連到 android device 裡,但 $ cd /data $ ls 會顯示錯誤: opendir failed, Permission denied 解法,下指令: run-as com.your.package 醬子就可以進去程式的資料夾裡,然後再透過

SQL Server 在缺少檔案組的情況如何還原資料庫

SQL Server 在缺少檔案組的情況下如何還原資料庫 一、背景   我有一個A庫,由於a,b兩張表的資料量比較大,所以對錶進行分割槽;在把A庫遷移到一個新的叢集上去,我只備份了A庫的主分割槽過去進行還原為B庫(主分割槽的備份還原可參考:SQL Server 維護計劃備份主分割槽 和 主分割槽備份與還原

修改tomcat的server.xml檔案後,eclipse在某些情況會自動還原server.xml檔案內容

原因:在eclipse裡整合新增tomcat時,eclipse會自動儲存tomcat的配置檔案。 解決辦法如下: 在eclipse中,刪除配置的tomcat,然後修改tomcat目錄conf檔案下的s

多個檔案目錄Makefile的寫法

1、前言   目前從事於linux下程式開發,涉及到多個檔案,多個目錄,這時候編譯檔案的任務量比較大,需要寫Makefile。關於Makefile的詳細內容可以參考網上流傳非常廣泛的《跟我一起寫Makefile》http://blog.csdn.net/haoel/article/details/2886/

使用QFileInfo類獲取檔案資訊(在NTFS檔案系統上,出於效能考慮,檔案的所有權和許可權檢查在預設情況下是被禁用的,通過qt_ntfs_permission_lookup開啟和操作。absolutePath()必須查詢檔案系統。而path()函式,可以直接作用於檔名本身,所以,path() 函

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo類為我們提供了系統無關的檔案資訊,包括檔案的名字和在檔案系統中位置,檔案的訪問許可權,是否是目錄或符合連結,等等。並且,通過這個類

Python+Selenium框架設計篇之6-一個類檔案多個測試方法情況測試韌體的寫法

      其實,到前面這一篇文章,簡單的Python+Selenium自動化測試框架就已經算實現了。接下來的主要是介紹,unittest管理指令碼,如何如何載入執行指令碼,再就是採用第三方外掛,實現輸出html的測試報告。本文來介紹下,在同一個類中,多個測試函式時候,測試

Linux檔案中查詢內容中某關鍵字檔案的方法

假如,你想在當前目錄下的所有普通檔案中搜索查詢包含:liehuo.net 這個詞的檔案,那麼命令如下: 1、# find . -name \* -type f -print | xargs grep “liehuo.net”2、#find -name 'EAI*.log'

android 打包上線忘記password 和 alias在有 簽名檔案情況如何找回

哈哈,這種需求我也是醉了。 今天有個搞ios的朋友(以前公司同事,現在是Leader)問我他們公司安卓要做版本升級,然後簽名檔案有但是password 和 alias忘記了,總不能重新搞個簽名檔案吧,密碼試了一大堆無濟於事,我聽後特麼感覺想笑,