Фортран 77 жалуется на общие блоки

Я использую gfortran 4.8.2 на FreeBSD 9.2 для создания некоторых исполняемых файлов. Есть три файла, один файл C и два файла 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.

Это сводит меня с ума. Есть идеи?

1 ответ

Решение

Уточняя мой комментарий

общее утверждение заставляет компилятор выделять глобальное хранилище для GDSCB2,

Символы CEBUF,INULL по Equivalence по существу, указатели на глобальное хранилище.

Теперь два data inull/0/ операторы избыточно инициализируют одно и то же место в глобальной памяти. Я не знаю, если это проблема или нет.. просто на что посмотреть.

Другая вещь, которую я вижу в inull - это 2 байта (возможно, или больше, но, конечно, не 1), но он эквивалентен самому последнему байту глобального массива символов. т.е. инициализация записывает данные за пределы выделенного пространства.

Если это вообще возможно, я бы избавился от общего все вместе. Выделите хранилище в вызывающей программе и передайте его в качестве аргумента подпрограммам.

в любом случае просто сделай CEBUF(4097)=char(0) вместо использования inull, как это.

Другие вопросы по тегам