日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Compiling Fortran

發布時間:2025/3/15 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Compiling Fortran 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Compiling Fortran

目錄

[隱藏]
  • 1 寫在前面
  • 2 Fortran 編程中相關文件后綴
  • 3 單個源文件生成可執行程序
  • 4 多個源文件生成可執行程序
  • 5 生成匯編代碼
  • 6 編譯預處理
  • 7 理解gfortran是gcc的前端
  • 8 其他參考

[編輯] 寫在前面

注意:本文是關于 gfortran 的文章。如果你不清楚 gfortran,g77,g95 等等的概念的話,不妨看看GCC 的 Fortran 語言編譯器介紹;如果你要用 g77 的話,這是一篇g77入門。

[編輯] Fortran 編程中相關文件后綴

.a靜態庫 (archive)
.f, .for, .FOR
.ftn
*, .f90*, .f95*, .f03*
Fortran源代碼(不需編譯預處理)
.F, .fpp, .FPP
.FTN
*, .F90*, .F95*, .F03*
Fortran源代碼(需要編譯預處理)
.rFortran源代碼(需要RatFor編譯預處理)
.o對象文件
.s匯編語言代碼
.so動態庫

其中,標 * 的后綴名是gfortran的文件后綴,g77不能識別。

[編輯] 單個源文件生成可執行程序

傳統的 Fortran 程序(也就是以 Fortran 77 為代表的)只能用大寫字符書寫,而且每行前六個字符為特定用途所保留。第一列為字符 C 或 * 所保留,用來表征整行都是注釋。第二列到第六列是為標號預留的。代碼從第七列開始,到72列結束(73列及以后將被直接忽略,可作注釋)。下面是示例程序采用的是傳統的 Fortran 格式:

C helloworld.f CPROGRAM HELLOWORLDWRITE(*,10)10 FORMAT('hello, world')END PROGRAM HELLOWORLD

編譯器 gfortran 并不要求所有代碼都大寫──程序中任何關鍵詞都可以用小寫字母。下面的命令將該程序編譯成可執行文件:

$ gfortran helloworld.f -o helloworld

注意到:gfortran 默認會將 .f, .for, .fpp, .ftn, .F, .FOR, .FPP 和 .FTN 結尾的文件作為固定格式處理,而將.f90, .f95, .f03, .F90, .F95 和 .F03 結尾的文件作為自由格式來處理。如果我們將上面程序文件重命名為 helloworld.f90,那么我們必須手動指定其為固定格式:

$ mv helloworld.f helloworld.f90 $ gfortran helloworld.f90 -ffixed-form -o helloworld

Fortran 90及以后的標準允許并鼓勵用自由的格式書寫 Fortran 代碼。注釋以感嘆號(!)開始直到行尾。先前的程序采用自由格式重寫如下,其中語句、標號都可從任一列開始:

! helloworldff.f90 ! Program Helloworld write(*,10) 10 format('hello, world')end Program Helloworld

后綴名為 .f90,故 gfortran 將其作為自由格式處理

$ gfortran helloworldff.f90 -o helloworldff

同樣,如果將程序重命名為傳統后綴名,那么要通過在命令行中加入選項 -ffree-form 進行編譯,如下:

$ mv helloworldff.f90 helloworldff.for $ gfortran -ffree-form helloworldff.for -o helloworldff

由于兩種格式的具有很大的區別,程序書寫是只能選擇其中的一種格式進行書寫。注意:遵守后綴約定是很重要的。

[編輯] 多個源文件生成可執行程序

命令 gfortran 可將多個 fortran 源碼文件編譯鏈接成為一個單一的可執行程序。下面列出了一個保存在文件 caller.f 中的簡單程序的主體部分,它調用一個函數并顯示出結果:

C caller.f CPROGRAM CALLERI = Iaverageof(10,20,83)WRITE(*,10) 'Average=', I10 FORMAT(A,I5)END PROGRAM CALLER

名為 Iaverage 函數定義在另一個獨立的源文件中,如下:

C called.f CINTEGER FUNCTION Iaverageof(i,j,k)Iaverageof = (i + j + k) / 3RETURNEND FUNCTION Iaverageof

通過下面的語句這兩個源碼文件可被編譯鏈接成一個名為 caller 的可執行程序:

$ gfortran caller.f called.f -o caller

同樣的結果可由下面的命令序列得到──先將每一個源碼文件編譯成對象文件,而后將對象文件鏈接為可執行程序:

$ gfortran -c caller.f -o caller.o $ gfortran -c called.f -o called.o $ gfortran caller.o called.o -o caller

[編輯] 生成匯編代碼

選項 -S 指示編譯器 gfortran 生成匯編語言代碼然後結束。要得到我們本文先前的 helloworld.f 例子的匯編代碼,只需輸入以下命令:

$ gfortran -S helloworld.f

生成的匯編語言文件名為 helloworld.s。匯編語言的具體形式依賴于編譯器的目標平臺。

[編輯] 編譯預處理

編譯以 .F, .fpp, .FPP, .FTN, .F90, .F95 和 .F03 結尾的文件時,在它真正編譯之前需要預處理。預處理器原本是為協助 C 語言工作所設計的。下面的例子是一個自由格式的 Fortran 程序,它通過預處理器將一個函數包含進主程序:

! evenup.F90 ! #define ROUNDUP #include "iruefunc.h" ! program evenup do 300 i=11,22j = irue(i)write(*,10) i,j 300 continue10 format(I5,I5) end program evenup

函數 irue() 的源代碼保存在文件 iruefunc.h 中,根據宏 ROUNDUP 所定義的值的不同將產生不同的編譯結果。該函數將任何一個奇數近似為一個偶數。默認情況下,它向下取近似,但是當 ROUNDUP 被定義時,該函數將向上取近似而得到一個偶數。ireu() 的函數體如下:

integer function irue(i) k = i / 2 k = k * 2 if (i .EQ. k) thenirue = i else #ifdef ROUNDUPirue = i + 1 #elseirue = i - 1 #endif end if end function irue

下面的命令將該程序編譯成可執行文件:

$ gfortran evenup.F90 -o evenup

采用自由格式寫程序以利用預處理器不是必須的。固定格式程序也可進行編譯預處理,下面的程序也是有效的:

C adder.F C #define SEVEN 7 #define NINE 9 Cprogram adderisum = SEVEN + NINEwrite(*,10) isum10 format(I5)end program adder

下面的命令將該程序編譯成可執行文件:

$ gfortran adder.F -o adder

[編輯] 理解gfortran是gcc的前端

像 g++ 一樣,gfortran 也只是設置過 Fortran 程序所需基本環境的 gcc 的一個前端。本文一開始的例子我們可以通過下面 gcc 的命令來編譯:

$ gcc helloworld.f -o helloworld -lgfortran -lgfortranbegin

庫文件 libgfortranbegin.a (通過命令行選項 -lgfortranbegin 被調用) 包含運行和終止一個 Fortran 程序所必須的開始和退出代碼。庫文件 libgfortran.a 包含 Fortran 底層的輸入輸出等所需要的運行函數。當運行 gfortran 時,會自動鏈接這兩個庫。這和下面的命令是等價的:

$ gfortran helloworld.f -o helloworld

當我們運行 gfortran 時,實際上運行并不是這個編譯器,而是編譯器驅動器。該驅動器解析命令行中所給出的選項,然后才調用真正的編譯器,匯編器和鏈接器。默認情況下,編譯器驅動器根據命令行中給定的文件的后綴決定它自己下一步的動作:一個名為 foo.c 將傳遞給 C 編譯器,而名為 foo.f95 的文件將傳遞給 Fortran 95 的編譯器,等等。

理解了這一點,我們就可以知道 gcc helloworld.f 將自動調用 fortran 的編譯器。只不過我們要為鏈接器指定必要的庫。

理解了這一點,我們可以知道 gfortran helloworld.c 可以編譯一個 c 程序,gfortran helloworld.cpp -lstdc++ 編譯的是一個 C++ 程序。

總結

以上是生活随笔為你收集整理的Compiling Fortran的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。