错误的LNK2005已定义为将C /Fortran解决方案更新为VS 2013

Error LNK2005 already defined on updating C++/Fortran solution to VS 2013

本文关键字:Fortran 解决方案 更新 2013 VS LNK2005 定义 错误      更新时间:2023-10-16

我试图从Visual Studio 2010到2013年更新工作的C 和Fortran解决方案。更新后,Win32平台定期构建,但Win64给出了以下错误:

error LNK2005: __CIpow already defined in libmmt.lib(pow_stub.obj)  
error LNK2005: _pow already defined in libmmt.lib(pow_stub.obj)  
fatal error LNK1169: one or more multiply defined symbols found 

我不知道为什么它仅在Win32上建立,或者我可以做什么来解决此问题。任何帮助都非常感谢。

很难为细节少提供帮助,但这里有一些事情要考虑。

平台依赖代码

您的代码并非不可能 - 例如,您可能具有取决于正在构建的平台的#ifdef代码。这可能意味着您的Win32和Win64版本正在编译不同的代码。但是,您的代码在Visual Studio 2010中成功构建的事实表明,这不太可能。

这样的变体可能是标准标头,以某种平台依赖性方式在Visual Studio 2010和Visual Studio 2013之间发生了变化。但这再次没有看到 - 不应该仅仅因为包括标头而破裂。

平台依赖性属性

多平台解决方案中建立错误的常见来源是两个平台的项目设置的差异。当然,某些属性假定在Win32和Win64之间是不同的,但其他属性应该是相同的,或者应该是"相同",因为它们使用了同一设置的32和64位版本。

值得浏览所有项目设置,以了解两个平台之间的意外差异。由于您遇到了链接器错误,因此可能特别值得检查链接器的"其他库目录"answers"其他依赖关系"设置。请记住,X64代码必须链接到文件的x64版本 - 通过使用其他文件名或链接到x64特定目录中的文件。

寻找属性变化的一种技巧是打开项目属性并将"平台"设置为"所有平台"。然后查找具有"<不同选项"值的单个属性。我认为在Visual Studio 2013中起作用,它肯定在Visual Studio 2015中起作用(对不起,我没有安装在任何方便的地方)。

Linker Diagnostics

另一种潜在的方法是打开链接器/详细的选项,并比较Win32和Win64构建的输出。将有一个输出的 lot ,但是您可以使用"查找"或diff工具来查找 __CIpow_pow链接的位置/如何链接的差异,从而可以为您提供线索。坏消息是它可能不会直接指向您的问题。您必须从链接器实际做的事情中向后工作,并结合一些侦探工作和实验,以找出实际发生的事情。

破坏变化

由于您正在从Visual Studio 2010升级到Visual Studio 2013的另一种可能性正在破坏变化。您必须仔细研究Visual Studio 2012中引入的破坏变化列表以及Visual Studio 2013中引入的破坏变化列表,以寻找可能产生您遇到的症状的东西。

事故

如果您还没有这样做,则应确认您的解决方案的Visual Studio 2010版本可为WN32和Win64成功构建。

假设确实如此,请使用您喜欢的DIFF工具比较2010年和2013年版本的.sln和.vcxproj文件。寻找在当前上下文中似乎没有意义的更改。总是有可能无意中改变的东西。

最后,如果您同时安装了Visual Studio 2010和Visual Studio 2013的系统,则可以使用Platform toolset属性使用Visual Studio 2013使用Visual Studio 2010 Toolset构建项目。如果您发现该解决方案已与2010年(V100)工具集成功编译和链接,但可能会因2013(v120)工具集而失败,该工具集可能会告诉您一些东西。

相关文章: