需要更多关于"_MSC_VER"LNK2038不匹配的解释

Need more explanation on LNK2038 mismatch dectected for '_MSC_VER'

本文关键字:LNK2038 VER 不匹配 解释 MSC      更新时间:2023-10-16

我从一位不再在公司的同事那里继承了一个旧程序。这是我们使用的CPLEX优化。它是使用Visual Studio 2005和CPLEX 121在C++中内部构建的。它所在的服务器正在停用,我们正试图将其迁移到新服务器。我正在尝试使用CPLEX 126在Visual Studio 2013中重新构建新的应用程序以进行优化。

我得到的错误是:

描述:

错误LNK2038:检测到"_MSC_VER"不匹配:值"1600"与(项目名称).obj 中的值"1800"不匹配

文件:

ilocplex.lib(ilocples.obj)

有相当多的这种不匹配。我是Visual Studio和C++的新手,但我已经设法更新了CPLEX链接,现在这个错误正在发生。

来自此论坛帖子:错误LNK2038:检测到'_MSC_VER';:值';1600';不会';t匹配值';1700';在CppFile1.obj 中

我已经能够推断出我可能可以对工具集做些什么,或者"重新编译我的库"——这在上一篇文章中似乎对一些人有效,但我需要更多关于如何做到这一点的具体帮助。

不,是对象文件。编译器发出的内容。它们似乎在.lib文件中。你需要重新编译它。–David Heffernan,2013年10月24日20:40

嗨,大卫,我是c++新手。我基本上是个c#程序员。你能详细说明评论吗?user1654136 2013年10月24日20:432

编译器告诉您使用VS2012重新编译Projectname1.lib。–David Heffernan 2013年10月24日20:48

我不知道这意味着什么,我也没有足够的声誉发表评论。

此外,

对于解决方案中的每个项目,请确保属性>配置。属性>常规>平台工具集是所有这些的一个,v100适用于visualstudio2010,v110适用于visualStudio 2012您也可能正在使用visualstudio2012atr的v100

的回答是"这对我有用"

我的项目的平台工具集是"Visual Studio 2013(v120)"。我需要添加一些其他工具集吗?下拉列表中没有其他选项。

.cpp文件中还有一个代码块:

// set up Visual Studio version #define _VS2005_ # if _MSC_VER < 1400 # undef _VS2005_ # endif

我也不知道这是在做什么,看看它是否导致了错误。

首先,您将无法重新编译CPLEX库,因为您将没有源代码,并且除非您在R&IBM内部的D团队。所以忘了那一套推理吧。您依赖于IBM提供一个预构建的库,该库可与您正在使用的编译器版本配合使用。

当你说你"设法更新了CPLEX链接,现在这个错误正在发生"时,我猜你设法更新了编译器使用的C++包含文件的路径,所以你的编译错误已经消失了。但是您可能还没有更新库路径以向编译器显示要链接的正确库集。

根据您发布的错误,"_MSC_VER":值"1600"与值"1800"不匹配,这告诉我您正试图链接到为VS2010构建的CPLEX库,而您的代码是使用VS2013编译的。例如,请参阅How to Detect if I';m使用Visual Studio 2008编译代码?

如果你是C++的新手,那么任何人都会期望你走进一个庞大的现有代码库,尝试移植到新的编译器和库,让它直接运行,而不需要做更多的研究和背景学习,这简直太疯狂了。您是否尝试过构建和运行CPLEX提供的C++示例?

您是否阅读了使用CPLEX设置C++项目的说明?它们位于CPLEX文件夹中的c_cpp.html文件中。

现在,我不知道CPLEX有VS2013的库。我这里没有12.6,所以我不能确定。看看你安装的CPLEX副本,可能是这样的:

C: \Program Files\IBM\ILOG\CPLEX_Studio126\CPLEX\lib

这应该会告诉你支持哪些版本的VS。我有x64_windows_vs2008、x64_windows-vs2010和x64_windows_vs2012

如果没有VS2013的库副本,那么我认为您将不得不回到VS2012或VS2010。可以配置VS2013,使其像VS2012一样工作,并诱使其生成兼容的代码;但我猜,从IBM的角度来看,这不会是一个"受支持的配置"。

#defineVS2005的内容是使用C++预处理器来定义一个符号,该符号可用于打开或关闭源代码的位。查找该符号在源代码中的使用位置。我猜这与你的链接问题完全不同。如果您对代码进行更改以使其与较新版本的编译器和库一起工作(或更好地工作),您可能会选择执行类似的操作。

Tim的答案是完全正确的,但这是他无法检查的部分。。。

VS2013没有CPLEX库,所以你不应该花时间寻找一些。。。这可以在本报告中看到,您可以从CPLEX Optimization Studio详细的系统需求中访问其他平台/版本的报告。

这意味着您必须使用Visual Studio 2012编译器。您仍然可以使用Visual Studio 2013环境:您要做的是安装这两个版本,并通过更改平台工具集指示Visual Studio 2013使用2012版本的编译器。但是,应用程序使用的所有其他库必须已由Visual Studio 2012编译器编译。你不能混搭。。。