1

我正在将带有旧 fortran 编译器和旧 Visual Studio(VC5)的应用程序移植到新的 fortran 编译器 11 和 Visual Studio 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 文件中只定义了一次。

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 一词就是为此)在版本之间发生了某种变化。以前编译器发现必须将多个文件中的公共块合并到一个变量中,现在它确实将变量的副本包含到每个 .obj 文件中,这会导致稍后的链接错误。您必须阅读新版本手册,了解新版本中常见块如何工作 - 这可能会阐明如何克服问题。

于 2009-07-03T05:37:29.527 回答
0

我不确定发生了什么,但混合语言程序曾经发生的一个问题是处理或加载语言特定的东西。例如,如果您有一个用 C 编写的 main 函数和一个执行 IO 的 fortran 子例程,那么使用 C 系统进行链接可能不会加载 fortran io 库,因为它对它们一无所知。

我想知道您是否在 C 或 C++ 中有 main 函数,链接器不知道公共块是全局变量。你可以试试把

extern char[2313] _SERVERSTUFF;

在你的函数 main 之前。您可能需要删除下划线和可能的 SERVERSTUFF 的情况

于 2009-07-31T16:53:02.863 回答