繁体   English   中英

在将C ++ / Fortran解决方案更新到VS 2013时已定义错误LNK2005

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

我正在尝试从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位版本的意义上应该是“相同的”。

值得浏览所有Project设置,以了解两个平台之间的意外差异。 由于出现链接器错误,因此特别值得研究链接器的“其他库目录”和“其他依赖项”设置。 请记住,x64代码必须链接到x64版本的文件-通过使用其他文件名或链接到x64特定目录中的文件。

寻找属性变化的一种技巧是打开“项目属性”并将“平台”设置为“所有平台”。 然后查找值为“ <不同选项>”的单个属性。 我认为这可以在Visual Studio 2013中使用,也可以在Visual Studio 2015中使用(对不起,我没有在方便的地方安装VS 2013)。

链接器诊断

另一种可能的方法是打开Linker / verbose选项并比较Win32和Win64版本的输出。 会有很多输出,但是您可以使用“ find”或diff工具查找__CIpow_pow链接的位置/方式的__CIpow ,这可能会为您提供线索。 坏消息是它可能不会直接指出问题的原因。 您必须从链接器的实际工作中倒退,并结合一些侦探性工作和实验来确定实际发生的情况。

重大变化

从Visual Studio 2010升级到Visual Studio 2013以来的另一种可能性是Breaking Changes。 您必须浏览Visual Studio 2012中 引入Breaking Changes列表和Visual Studio 2013中引入Breaking Changes列表, 寻找可能会产生症状的东西。

事故

如果尚未执行此操作,则应确认解决方案的Visual Studio 2010版本可以针对Wn32和Win64成功构建。

假设确实如此,请使用您喜欢的差异工具比较2010和2013版本中的.sln和.vcxproj文件。 寻找在当前情况下似乎没有意义的更改。 总是有可能无意间更改了某些内容。

最后,如果您的系统同时安装了Visual Studio 2010和Visual Studio 2013,则可以使用Platform Toolset属性使用Visual Studio 2013通过Visual Studio 2010工具集构建项目。 如果您发现该解决方案可以成功使用2010(v100)工具集进行编译和链接,但是无法使用2013(v120)工具集进行编译和链接,这可能会告诉您一些信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM