2009-07-03 11 views
1

Ich portiere die Anwendung mit alten Fortran Compiler und alten Visual Studio (VC5) zu neuen Fortran Compiler 11 und Visual Studio 2005. Anwendung enthält sowohl 'C' und Fortran-Code. Ich kompiliere den Fortran-Code und erstelle die Bibliothek namens server_lib.lib (die Bibliothek erstellt mit einigen Warnungen) und verlinke mit dem 'C'-Code. Während die Verknüpfung Anwendung gibt einige unten Linkfehler.Verknüpfungsfehler von C Sprache in Fortran-Bibliothek

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 

oben "serverstuff" wird in server.For-Datei definiert und diese server.For wird in allen oben genannten Dateien enthalten. Sie finden den folgenden Codeblock von server.for Datei. Aber die Serverstuff-Variable wurde nur einmal in server.for definiert.

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/ 

Warum gibt der obige Code einen Fehler bei der Deklaration? Wie es mit früheren Fortran Compilern funktioniert hat? Wenn ich die "COMMON/serverstuff/clientIndex, dBuffer" Zeile kommentieren, dann ist es perfekt verlinkt, aber die Anwendung ist abgestürzt.

Bitte geben Sie mir eine Idee, da ich nicht über Fortran Sprache weiß.

+0

Es könnte nur ein Fehler im Compiler sein. Haben Sie das gesehen: http://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/56995/ – sharptooth

Antwort

1

Das Problem ist, dass die Bedeutung von gemeinsame Blöcke (das Wort COMMON ist dafür) hat sich irgendwie zwischen den Versionen geändert. Zuvor hatte der Compiler herausgefunden, dass die allgemeinen Blöcke in mehreren Dateien zu einer Variablen zusammengeführt werden müssen und jetzt enthält er eine Kopie der Variablen in jede .obj-Datei und dies verursacht später einen Verbindungsfehler. Sie müssen das Handbuch der neuen Version lesen, wie die allgemeinen Blöcke in der neuen Version funktionieren - das wird wahrscheinlich Aufschluss darüber geben, wie das Problem gelöst werden kann.

+0

Hallo Danke für Ihre Antwort. Wie Sie bereits gesagt haben, ist server.for in einigen anderen Dateien enthalten, obwohl es sich um eine globale Variable handelt, gibt Serverstuff beim Verknüpfen von Bibliotheken ein Problem bei der erneuten Deklaration. Wie kann ich diese COMMON-Daten so aufteilen, dass sie in allen benötigten Dateien enthalten sein sollte und keinen Fehler bei der erneuten Deklaration geben sollte ?? Ich verwende jetzt Fortran 11.0.035 Compiler. Nach meiner Untersuchung ist die allgemeine Deklaration korrekt, aber ich bin mir nicht sicher. Vielen Dank im Voraus .. –

0

Ich bin mir nicht sicher, was passiert, aber ein Problem, das bei gemischten Sprachprogrammen aufgetreten ist, war die Verarbeitung oder das Laden von sprachspezifischen Dingen. Wenn Sie zum Beispiel eine Hauptfunktion in C geschrieben haben und eine Fortran-Unterroutine, die IO ausführt, dann kann die Verknüpfung mit dem C-System die Fortran-Bibliotheken nicht laden, weil sie nichts über sie weiß.

Ich frage mich, wenn Sie eine Hauptfunktion in C oder C++ haben, weiß der Linker nicht, dass der gemeinsame Block eine globale Variable ist. Sie könnten versuchen,

extern char[2313] _SERVERSTUFF; 

vor Ihrer Funktion Haupt setzen. Sie müssen möglicherweise mit dem Entfernen der Unterstreichung und möglicherweise der Fall von SERVERSTUFF