我使用旧的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语言的知识。
答案 0 :(得分:1)
问题在于公共块(COMMON这个词的含义)的含义在版本之间有所改变。以前编译器发现几个文件中的公共块必须合并到一个变量中,现在它确实包含了每个.obj文件中的变量副本,这会导致链接错误。您必须阅读有关常见块如何在新版本中工作的新版本手册 - 这可能会阐明如何克服该问题。
答案 1 :(得分:0)
我不确定发生了什么,但过去混合语言程序出现的问题是处理或加载特定语言的东西。例如,如果你有一个用C编写的main函数和一个执行IO的fortran子例程,那么使用C系统进行链接可能无法加载fortran io库,因为它对它们一无所知。
我想知道你是否在C或C ++中有一个主函数,链接器不知道公共块是一个全局变量。 你可以试试
extern char[2313] _SERVERSTUFF;
在你的功能主要之前。您可能需要使用删除下划线和SERVERSTUFF
的情况