Gcc Fortran 77抱怨公共块

Gcc Fortran 77抱怨公共块,gcc,compiler-errors,fortran,gfortran,fortran-common-block,Gcc,Compiler Errors,Fortran,Gfortran,Fortran Common Block,我正在使用FreeBSD9.2上的gfortran 4.8.2创建一些可执行文件。有三个文件,一个C文件和两个Fortran 77文件,其中我使用两个例程和一个公共块 问题是我从gfortran编译器收到了多个定义的错误 我已发送到服务器的请求: autoreconf ./configure make make all-am gcc -DHAVE_CONFIG_H -I. -DDI88xx -g -O2 -MT src/di8810-di8810.o -MD -MP -MF src/.

我正在使用FreeBSD9.2上的gfortran 4.8.2创建一些可执行文件。有三个文件,一个C文件和两个Fortran 77文件,其中我使用两个例程和一个公共块

问题是我从gfortran编译器收到了多个定义的错误

我已发送到服务器的请求:

autoreconf
./configure
make
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.
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]);
}
gds102.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
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
错误是:

autoreconf
./configure
make
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.

它快把我逼疯了。有什么想法吗?

详细阐述我的评论

common语句使编译器为
GDSCB2
分配全局存储

符号
CEBUF,INULL
是通过
等价性
基本上指向全局存储器的指针

现在,两个
data inull/0/
语句正在冗余地初始化相同的语句 全局内存中的位置。我不知道这是不是个问题,只是看看而已

我看到的另一个inull是2个字节(可能..或者更多,但肯定不是1个) 但它相当于全局字符数组的最后一个字节。即初始化写入超出分配空间的数据

如果可行的话,我会一起把普通的东西都除掉。在调用程序中分配存储,并将其作为参数传递给子例程


在任何情况下,只需执行
CEBUF(4097)=char(0)
即可,而不必像那样使用inull。

您是否也有一个名为gdscb2的函数?不,只有公共块中的名称。您可以将其精简为最小的代码来重现问题。将2字节整数与字符数组中的最后一个位置等效似乎很奇怪。然后在每个例程中分别初始化相同的位置,这也很奇怪。@george,我将在周一尝试并报告。该代码实际上可以在HP-UX和HP Fortran编译器上运行,但我们正在尝试中期迁移到标准平台(FreeBSD、Linux)。@george,请重新表述为“然后在每个例程中分别初始化同一位置,这也很奇怪。”。我删除了
gds102.f
中的
数据INULL/0/
,并能够编译和链接。不过,我对代码还有另一个问题。