1

古い fortran コンパイラと古いビジュアル スタジオ (VC5) のアプリケーションを、新しい fortran コンパイラ 11 とビジュアル スタジオ 2005 に移植しています。アプリケーションには、'C' と fortran コードの両方が含まれています。Fortran コードをコンパイルし、server_lib.lib という名前のライブラリを作成しています (ライブラリはいくつかの警告を表示して作成しています)。「C」コードにリンクしています。アプリケーションをリンクしている間、以下のリンクエラーが発生しています。

2>Linking...
2>server_lib.lib(Preparx.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Query.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Utm.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Runvhf.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(PFLTPV.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Qdesic.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Headach.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Plotky.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Terrain.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Morpho.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Diflos.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Micro.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(OpenGL_F.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Violet.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Fieldp.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(Step.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>server_lib.lib(White.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj)
2>.\Debug/Server.exe : fatal error LNK1169: one or more multiply defined symbols found

上記の「serverstuff」はserver.forファイルで定義されており、このserver.forは上記のすべてのファイルに含まれています。server.for ファイルから以下のコード ブロックを見つけてください。ただし、serverstuff 変数は server.for ファイルで 1 回だけ定義されます。

INTEGER iErrPipe !error code for pipe i/o
INTEGER clientIndex !index into client list
CHARACTER*136 Buffer(17) !buffer for pipe i/o
CHARACTER dBuffer(2313) !buffer for pipe i/o
EQUIVALENCE(dBuffer,Buffer)
COMMON/serverstuff/clientIndex,dBuffer

DATA dBuffer(2313)/0/

上記のコードで再宣言エラーが発生するのはなぜですか? 以前の fortran コンパイラではどのように機能しましたか? 「COMMON/serverstuff/clientIndex,dBuffer」行にコメントすると、完全にリンクしますが、アプリケーションがクラッシュします..

Fortran 言語について無知なため、どなたか教えてください。

4

2 に答える 2

1

問題は、共通ブロックの意味(COMMON という単語はそのためのものです) がバージョン間で何らかの形で変更されていることです。以前、コンパイラは、複数のファイルの共通ブロックを 1 つの変数にマージする必要があることを認識していましたが、現在は変数のコピーをすべての .obj ファイルに含めているため、後でリンク エラーが発生します。新しいバージョンで共通ブロックがどのように機能するかについては、新しいバージョンのマニュアルを読む必要があります。これにより、問題を解決する方法が明らかになるでしょう。

于 2009-07-03T05:37:29.527 に答える
0

何が起こっているのかわかりませんが、混合言語プログラムで発生していた問題は、言語固有のものの処理またはロードでした。たとえば、C で書かれたメイン関数と IO を行う fortran サブルーチンがある場合、C システムを使用してリンクすると、fortran io ライブラリが読み込まれないことがあります。

C または C++ にメイン関数がある場合、リンカーは共通ブロックがグローバル変数であることを知りません。あなたは入れてみることができます

extern char[2313] _SERVERSTUFF;

関数 main の前に。アンダースコアを削除して遊ぶ必要があるかもしれません.SERVERSTUFFの場合もあります

于 2009-07-31T16:53:02.863 に答える