2013-11-22 142 views
0

我在FreeBSD 9.2上使用gfortran 4.8.2來創建一些可執行文件。有三個文件,一個C文件和兩個Fortran 77文件,我使用兩個具有一個公共塊的例程。Fortran 77抱怨常見塊

問題是我從gfortran編譯器收到多個定義的錯誤。

請求,我已經發送到服務器:

autoreconf 
./configure 
make 

di8810.c

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 

void main(argc,argv) 

int argc; 
char *argv[]; 
{ 
    if (argc != 4) 
    { 
      exit(99); 
    } 
     gds100(argv[1],argv[2],argv[3]); 
} 

gds100.f

SUBROUTINE GDS100(AUSGABE,FORMAT,FILENAME) 
CHARACTER*4097 EBUF 
CHARACTER*264 BUFFER  
CHARACTER*1 CBUFFER(264)  
CHARACTER*1 CEBUF(4097)  
CHARACTER*1 FORMAT 


INTEGER*2 INULL  
CHARACTER*1 LTEXT(112)  
COMMON /GDSCB2/ EBUF  
EQUIVALENCE (EBUF,CEBUF(1))  
EQUIVALENCE (CEBUF(4097),INULL)  
DATA INULL /0/  
... 
END 

gds102.f

SUBROUTINE GDS102 

CHARACTER*264 BUFFER  
CHARACTER*1 CBUFFER(264)  
CHARACTER*4097 EBUF  
CHARACTER*1 CEBUF(4097)  
INTEGER*2 INULL  
INTEGER POIADR  
COMMON /GDSCB2/ EBUF  
EQUIVALENCE (BUFFER,CBUFFER(1))  
EQUIVALENCE (EBUF,CEBUF(1))  
EQUIVALENCE (CEBUF(4097),INULL)  
DATA IWOGRZ /4096/  
DATA INULL /0/  
ENTRY GDSUMS(N) 
... 
END 

的錯誤是:

make all-am 
gcc -DHAVE_CONFIG_H -I. -DDI88xx -g -O2 -MT src/di8810-di8810.o -MD -MP -MF src/.deps/di8810-di8810.Tpo -c -o src/di8810-di8810.o `test -f 'src/di8810.c' || echo './'`src/di8810.c 
mv -f src/.deps/di8810-di8810.Tpo src/.deps/di8810-di8810.Po 
gfortran -cpp -fcheck=all -fno-underscoring -DDI88xx -g -O2 -c -o src/di8810-gds100.o `test -f 'src/gds100.f' || echo './'`src/gds100.f 
gfortran -cpp -fcheck=all -fno-underscoring -DDI88xx -g -O2 -c -o src/di8810-gds102.o `test -f 'src/gds102.f' || echo './'`src/gds102.f 
gfortran -cpp -fcheck=all -fno-underscoring -DDI88xx -g -O2 -o di8810 src/di8810-di8810.o src/di8810-gds100.o src/di8810-gds102.o 
src/di8810-gds102.o: In function `gds102': 
/.amd_mnt/blnn728x/home/sayik_bo/di8810_t/src/gds102.f:2: multiple definition of `gdscb2' 
src/di8810-gds100.o:/.amd_mnt/blnn728x/home/sayik_bo/di8810_t/src/gds100.f:1: first defined here 
collect2: Fehler: ld gab 1 als Ende-Status zurück 
*** [di8810] Error code 1 

Stop in /.amd_mnt/blnn728x/home/sayik_bo/di8810_t. 
*** [all] Error code 1 

Stop in /.amd_mnt/blnn728x/home/sayik_bo/di8810_t. 

Stop in /.amd_mnt/blnn728x/home/sayik_bo/di8810_t. 
*** [all] Error code 1 

Stop in /.amd_mnt/blnn728x/home/sayik_bo/di8810_t. 

它的駕駛我堅果。有任何想法嗎?

+0

你還有一個叫做gdscb2的函數嗎? – cup

+0

不,只有公共塊中的名稱。 –

+1

是否可以將其修剪爲最小代碼來重現問題。將一個2字節的整數等同於char數組中的最後一個位置似乎很奇怪。然後,你在每個例程中分別初始化相同的位置,也是奇怪的。 – agentp

回答

1

詳細闡述了我的意見

的共同聲明使編譯器來分配全球存儲爲GDSCB2

符號CEBUF,INULL是由Equivalence實質上指向全局存儲。

現在兩個data inull/0/語句冗餘地初始化全局內存中相同的 位置。我不知道這是否是一個問題,只是需要注意。

我在那裏看到的其他東西是inull是2個字節(可能..或許更多但肯定不是1) 但它等同於全局字符數組的最後一個字節。即,初始化寫入超出分配空間的數據。

如果在所有可行的情況下,我會擺脫共同的一起。在調用程序中分配存儲並將其作爲參數傳遞給子例程。

在任何情況下只是做CEBUF(4097)=char(0)而不是像那樣使用inull。