Фортран 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, как это.