我想製作一個有用的函數庫。我對這個知之甚少,但顯然它們中的大多數(如果不是全部的話)都需要包含在模塊中(或者在程序中的一個接口中),但是因爲這是爲了創建一個庫,這似乎不是一種選擇),否則我將使用它們的程序將無法識別它們。有組織的函數庫與Fortran函數
我可以製作一個包含所有這些功能的模塊的長文件,但我希望將不同的功能保留在不同的短文件中。但是,如果我這樣做,我將不得不爲每個函數創建一個不同的模塊,並且如果我想在程序中使用它們,我會有一個很長的USE
聲明列表(更不用說.mod文件的數量了那將會產生)。
對於這個我唯一可能的解決方案就是爲所有其他模塊創建另一個模塊,其中只有USE
聲明,但是我認爲必須有另一種方法來創建一個包含不是目前爲止的函數的庫牽強。
此外,爲什麼我有這個問題的功能,但沒有子程序?是因爲命令CALL
立即將該行標識爲子例程調用,而函數只是通過名稱調用,而沒有命令告訴編譯器「嘿,這是一個函數」,所以它必須知道什麼是函數,什麼不是事先指定的?
我包括一個示例(按照http://www.oceanographers.net/forums/showthread.php?378-How-to-make-a-FORTRAN-library中的說明,並使用正確的'路徑')。
TestFunc.F90
FUNCTION SumNum(nNum1,nNum2) RESULT(nResult)
IMPLICIT NONE
INTEGER,INTENT(IN) :: nNum1,nNum2
INTEGER :: nResult
nResult=nNum1+nNum2
RETURN;END FUNCTION
TestProg.F90
PROGRAM TestProg
IMPLICIT NONE
WRITE(6,*) SumNum(2,2)
STOP;END PROGRAM
命令行
> gfortran -c TestFunc.F90 -o TestFunc.o
> ar ruv libmylib.a *.o
> gfortran TestProg.F90 -o Test.x -L/path -lmylib.a
TestProg.F90:6.12:
WRITE(6,*) SumNum(2,2)
1
Error: Function 'sumnum' at (1) has no IMPLICIT type
你是否在程序中以某種方式聲明函數?我的程序仍然沒有認識到這個功能。我在第二次編輯中添加了一個不起作用的示例代碼。 – Nordico
@Nordico我更新了答案,不適合在評論框中。 – milancurcic
好的。儘管這樣做不需要將東西放在模塊中並且有很多.mod文件,但我仍然必須在所有程序中指定我將事先使用哪些函數(只有我將它們聲明爲變量而不是使用「USE」適當的mod)。它確實好得多,但我想知道是否有一種方法可以像調用任何固有的fortran函數一樣調用我的函數:通過調用該命令,不必做任何以前的聲明(只需將庫鏈接到編譯時間)。 – Nordico