2010-07-29 301 views
3

我不是Fortran程序員(只是一個很短的經驗),但我需要編譯一個部分寫在F77中的程序。有人在我之前編譯了Absoft編譯器,但現在我需要在g77的另一臺機器上重複該過程。對於Absoft公司,makefile文件有F77:使用g77編譯的程序問題通常使用Absoft編譯器進行編譯

f77 -f -w -O -B100 -B108 -c *.f 
mv *.f flib && mv *.o olib 
f77 -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH -lfpvm3 -lpvm3 -L$ABSOFT/lib -lU77 

我已經修改了這些行是

g77 -w -O -B100 -B108 -c *.f 
mv *.f flib && mv *.o olib 
g77 -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH -lfpvm3 -lpvm3 -lgfortran -lgfortranbegin 

,但我得到了以下錯誤消息

somefile.f:(.text+0x93): undefined reference to `for_open' 
somefile.f:(.text+0xf4): undefined reference to `for_write_seq_fmt' 
somefile.f:(.text+0x128): undefined reference to `for_write_seq_fmt_xmit' 
somefile.f:(.text+0x454): undefined reference to `for_read_seq' 

我該如何解決這個問題?


UPDATE1

如果我添加-libifcore到最後一行(連接器)的結束,然後我得到

/usr/bin/ld: cannot find -libifcore 

我已經找到了庫

$ find /opt/intel/* -name 'libifcore*' 
/opt/intel/fce/9.1.036/lib/libifcore.a 
/opt/intel/fce/9.1.036/lib/libifcore.so 
/opt/intel/fce/9.1.036/lib/libifcore.so.5 
/opt/intel/fce/9.1.036/lib/libifcore_pic.a 
/opt/intel/fce/9.1.036/lib/libifcoremt.a 
/opt/intel/fce/9.1.036/lib/libifcoremt.so 
/opt/intel/fce/9.1.036/lib/libifcoremt.so.5 
/opt/intel/fce/9.1.036/lib/libifcoremt_pic.a 

但即使我在源目錄中執行以下操作ectory

$ export PATH=$PATH:/opt/intel/fce/9.1.036/lib/ 
$ ln -s /opt/intel/fce/9.1.036/lib/libifcore.so 

找不到它。

而且,在同一臺機器在那裏我得到了另一個問題How to pass -libm to MPICC? libimf.so: warning: feupdateenv is not implemented and will always fail

看來,編譯器應該找到庫,如果需要的話

$ echo $LD_LIBRARY_PATH 
/opt/intel/fce/9.1.036/lib:/opt/intel/cce/9.1.042/lib:/usr/local/lib/openmpi:/usr/local/lib:/usr/lib: 
+2

庫的動態鏈接不依賴於'PATH',而是依賴於'ldd.conf'和'LD_LIBRARY_PATH'的內容。 – dmckee 2010-07-29 23:16:36

回答

0

看來問題出在一個源文件中的錯誤,這對於Absoft編譯器來說不是什麼大問題。 g77正在發出警告,但編譯該文件併產生原始錯誤(在問題中提到)而沒有二進制文件。

當我試着ifort,該文件的編譯被中止,但其他文件被編譯,並創建一個二進制文件。

fortcom: Error: somefile.f, line 703: An extra comma appears in the format list. [)] 
    & (1p5e12.3,5h ...,))            
-------------------------^ 
compilation aborted for somefile.f (code 1) 

當我刪除了額外的逗號,然後兩種編譯器編譯一切,創建程序,儘管ifort產生了一些警告。

然後,當我試圖運行兩個二進制文件時,由英特爾公司製作的二進制文件工作正常,但是g77的文件非常奇怪,並沒有真正做我想做的。

所以現在原來的問題已經解決了,但是代碼並沒有在多處理模式下運行,所以這個二進制文件對我來說是不幸的。

1

它看起來像你試圖用libifcore鏈接。

編輯: 您可以通過添加 「-lifcore」到您的編譯器選項包括這個庫。引述gcc tutorial

一般來說,編譯器選項-lname將嘗試目標文件與標準庫目錄庫文件「libName.a的」鏈接。

+0

我已根據您的答案評論更新了我的問題。你能指導我嗎? – Andrei 2010-07-29 20:06:04

+0

你想-lifcore語法將ib刪除,我很確定 – deinst 2010-07-30 01:28:15

+0

是的,他可以添加libifcore到他的鏈接上面建議的,但我懷疑這是整體解決方案。如果沒有任何意義,編譯並鏈接到g77的Fortran程序將鏈接到英特爾Fortran庫。是否使用ifort預編譯的其他庫之一?這可能是鏈接尋找英特爾庫的原因。那麼如果你有源代碼,最好用相同的Fortran編譯器重新編譯。或者,也許g77對這些例程使用相同的名稱,libifcore與它無關。 – 2010-07-30 01:55:24

2

Absoft接受了Fortran 77的擴展版本,該擴展版本與g77接受的Fortran 77的擴展版本不完全兼容。

所以不能保證你可以這樣做而不需要編輯代碼。我似乎記得Absoft編譯器接受了一個不能用g77複製的方便的初始化語法。

+0

在源代碼中,我看到了關於g77的一些註釋,並且代碼是分佈式的,所以我得出結論:如果編譯人員知道他/她正在做什麼,那麼它可以用g77編譯。我的問題是我不知道。我相信解決方案是一個鏈接合適的庫的問題。 – Andrei 2010-07-29 19:54:52

+0

@Andrei:啊。這讓你最後一次*我*試圖做到這一點......我會留下答案,雖然我的情況下有人來看看誰是在不太開心的情況下。 – dmckee 2010-07-29 23:14:50

1

如果您想使用g77編譯&鏈接,最簡單的方法是使用命令「g77」。 (f77在您的計算機上調用了哪些編譯器?嘗試使用「f77 -v」或類似命令查找...)它應該自動查找g77 Fortran特定的庫。您不需要明確鏈接到Fortran庫,特別是不需要gfortran庫,這是一個不同的編譯器。你也可以用gfortran編譯&鏈接 - 它可能會認識到源代碼是Fortran 77,並且如果文件具有正確的文件類型,就會適當地編譯,否則你將不得不使用選項 - 對於這個編譯器,使用命令「 gfortran」。

對於g77和gfortran,它不應該需要英特爾庫 - 也許f77連接到計算機上的英特爾編譯器ifort?

稍後編輯:

我建議先嚐試一些更簡單的方法來測試您的設置。

試試這個FORTRAN 77程序作爲文件 「junk.f」

C234567 
     write (6, *) "Hello World" 
     stop 
     end 

試試這個命令:

G77 junk.f -o junk.exe

通過運行它

./junk.exe

這將測試g77是否正在工作。

+0

對不起,我沒有明確寫過,'f77'命令鏈接到'g77'。我會更新我的問題。我認爲Warewulf集羣有些奇怪,如果用'ld'來考慮我的另一個類似的錯誤信息的問題。 – Andrei 2010-07-29 22:06:11

+0

我剛剛嘗試過使用'ifort' - 它也沒有找到'libifcore'。我猜在庫路徑變量等方面有些問題。 – Andrei 2010-07-29 22:21:20

+0

我可以用'g77'和'ifort'編譯'junk.f',並且這個程序在兩種情況下都可以工作。 – Andrei 2010-07-30 08:52:44

1

你爲什麼要用g77而不是gfortran? 你是什麼意思與多處理? openmp還是矢量化的?

你可以在gfortran編譯器中使用openmp,當你想像ifort編譯器一樣使用向量模式時,你必須在編譯器選項中明確指定sse。

相關問題