0

FreeBSD 9.2 で gfortran 4.8.2 を使用して、いくつかの実行可能ファイルを作成しています。1 つの C ファイルと 2 つの Fortran 77 ファイルの 3 つのファイルがあり、1 つの共通ブロックで 2 つのルーチンを使用しています。

問題は、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.

それは私を夢中にさせています。何か案は?

4

1 に答える 1

1

私のコメントを詳しく説明する

common ステートメントにより、コンパイラは にグローバル ストレージを割り当てGDSCB2ます。

シンボルCEBUF,INULLは、Equivalence基本的にグローバル ストレージへのポインターです。

現在、2 つのdata inull/0/ステートメントは、グローバル メモリ内の同じ場所を重複して初期化しています。それが問題かどうかはわかりません..ただ見るだけです。

他に inull があるのは 2 バイト (おそらく..またはそれ以上かもしれませんが、確かに 1 ではありません) ですが、グローバル文字配列の最後のバイトと同等です。つまり、初期化により、割り当てられたスペースを超えてデータが書き込まれます。

可能であれば、共通のものをまとめて取り除きます。呼び出し元プログラムでストレージを割り当て、それを引数としてサブルーチンに渡します。

いずれにしても、CEBUF(4097)=char(0)そのように inull を使用する代わりに実行してください。

于 2013-11-26T00:14:21.337 に答える