2013-11-22 103 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。