2015-07-02 153 views
2

我有一套從NETLIB網站獲得的blas/lapack函數。我想將這些函數放入Fortran模塊中。我的代碼的其餘部分是用Fortran 90所以我去這樣做:模塊和傳統的Fortran 77代碼

module modname 
contains 


double precision function ddot(n,dx,incx,dy,incy) 
. 
. 
. 
end function 


subroutine dpofa(a,lda,n,info) 
. 
. 
     double precision ddot 
. 
end subroutine dopfa 
end module 

當我編譯使用

gfortran modname.f90 

我得到以下錯誤:

/tmp/ccC2EUFj.o: In function __temp_MOD_dpofa': temp.f90:(.text+0x11c): undefined reference to ddot_'

我忽略關於Undefined reference to main的錯誤,我意識到這是因爲我沒有程序..文件中的結束程序語句。

但是,如果我刪除module modname,containsend module的行,編譯器將無任何問題地編譯。

可能是什麼問題?

+0

您需要告訴gfortran與數學庫鏈接,例如:'-llapack -lblas' –

+0

我在模塊中擁有源代碼本身。我不明白爲什麼我需要鏈接到lapack/blas – mod0

回答

3

在您的非模塊方法中,您有許多外部函數和子例程。也就是說,如果這些被定義在模塊之外,那麼一個程序就不知道另一個程序。通過使用聲明語句double precision ddot告訴子程序dpofa有關函數ddot。編譯器把這個名字翻譯成ddot_(詳情參見其他地方),並且也破壞了實際功能的名稱。鏈接器在需要時將一個符號解析爲另一個符號。

當你開始使用模塊時,你仍然有這個外部函數聲明,但現在你在同一個模塊中的實際函數不再是外部函數了。相反,有一個模塊程序會被重新設置爲__temp_MOD_ddot之類的東西。您不再創建具有損壞名稱ddot_的功能。

大概你可以參考功能ddotdpofa,但在模塊版本將是符號ddot_這是沒有定義。

您將要刪除現在在同一個模塊中定義的功能的聲明,並且不再是外部的。

+0

謝謝!有效。 – mod0