gcc - Fortran 77 提示常见 block

标签 gcc compiler-errors fortran gfortran fortran-common-block

我在 FreeBSD 9.2 上使用 gfortran 4.8.2 来创建一些可执行文件。有三个文件,一个 C 文件和两个 Fortran 77 文件,其中我使用两个例程和一个公共(public) block 。

问题是我从 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.

它快把我逼疯了。有任何想法吗?

最佳答案

详细说明我的评论

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

符号 CEBUF,INULL来自 Equivalence本质上是指向全局存储的指针。

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

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

如果可行的话,我会一起摆脱共同点。在调用程序中分配存储并将其作为参数传递给子例程。

无论如何只要做CEBUF(4097)=char(0)而不是像那样使用 inull 。

关于gcc - Fortran 77 提示常见 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146241/

相关文章:

c - 递归程序中编译器的优化

枚举类型 "The public type EngineType must be defined in its own file Car.java"的 Java 编译错误

shell - 如何添加 shell 命令并在 Fortran 程序中使用结果?

c++ - FORTRAN 函数返回数组导致段错误(从 C++ 调用)

android - 通过 Cygwin 在 Windows 上为 x86 Android 构建 Android NDK 工具链

c++ - 使用 GCC 编译 C++ 程序

c++ - 编译文件告诉makefile如何编译

ios - 如何修复Mac o链接器(id错误)

C:\Program Files(x86)\Windows Kits\8.1\Include\um\dbghelp.h(1545):错误C2220:警告被视为错误 - 未生成 'object'文件

file-io - 在一行中打印和写入?