【问题标题】:Need more explanation on LNK2038 mismatch dectected for '_MSC_VER'需要更多解释为“_MSC_VER”检测到的 LNK2038 不匹配
【发布时间】:2014-04-17 20:47:42
【问题描述】:

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

我得到的错误是:

说明:

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

文件:

ilocplex.lib(ilocplex.obj)

这样的不匹配有很多。我是 Visual Studio 和 C++ 的新手,但我设法通过更新 CPLEX 链接来工作,现在这个错误正在发生。

来自此论坛帖子: error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj

我已经能够推断出我可以对工具集做一些事情或“重新编译我的库”这似乎对上一篇文章中的某些人有用,但我需要更具体的帮助来了解如何做那。

不,是目标文件。编译器发出什么。它们似乎在 .lib 文件中。你需要重新编译它。 – 大卫赫弗南 2013 年 10 月 24 日 20:40

嗨,大卫,我是 C++ 新手。我基本上是一名 C# 程序员。能否请您详细说明 cmets – user1654136 2013-10-24 20:43:37 2

编译器告诉你用 VS2012 重新编译 Projectname1.lib。 ——大卫·赫弗南 2013 年 10 月 24 日 20:48

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

还有,

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

回复是“这对我有用”

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

.cpp文件中还有一段代码:

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

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

【问题讨论】:

  • 确保解决方案中每个项目的平台工具集设置为v120,然后重建所有内容。如果这不能解决错误,则问题可能是您正在链接到使用 VS2005 编译的库(可能是 ilocplex.lib?我无法从错误消息中确定)。您需要使用 VS2013 重新编译有问题的库。
  • 如何重新编译库?我是 VS 新手
  • 下载源代码,打开项目解决方案,全部构建。
  • 希望有一个与该库关联的项目文件 (.vcproj)。在这种情况下,在 VS2013 中打开项目文件,更改平台工具集(如果升级过程由于某种原因没有这样做)并重建项目。如果没有项目文件,最好的办法是创建一个新项目,将涉及的源文件添加到该项目并编译。 MSDN 应该有关于如何去做这一切的文章。
  • 我在构建时得到了错误。

标签: c++ visual-studio visual-studio-2013 visual-studio-2005 cplex


【解决方案1】:

首先 - 您将不能够重新编译 CPLEX 库,因为您将没有源代码并且除非您在 IBM 的研发团队工作,否则您无法获得它.所以忘记那条推理。您依赖于 IBM 提供的预构建库,该库可与您使用的编译器版本配合使用。

当您说您“设法通过更新 CPLEX 链接来工作,现在正在发生此错误”时,我猜您设法更新了编译器使用的 C++ 包含文件的路径,所以你的编译错误已经消失了。但您可能尚未更新库路径以向编译器显示要链接的正确库集。

从您发布的错误中,'_MSC_VER': value '1600' doesn't match value '1800',这对我说,您正在尝试链接为 VS2010 构建的 CPLEX 库,而您的代码已编译使用VS2013。参见例如How to Detect if I'm Compiling Code With 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 的角度来看,这不是“支持的配置”。

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

【讨论】:

  • 我们已经有几个人接连离职,因此维护当前项目一直是当务之急,不一定要学习 C++(或 C#)或为这些情况建立知识库可能的。我刚刚将 CPLEX 链接从 x64_windows_VS2010 文件夹切换到 x64_windows_VS2012,现在我的不匹配是“1700”与“1800”不匹配。看起来这是我的问题。我没有安装 x64_windows_VS2013 文件夹。我将尝试让我们控制新服务器的人来看看我们是否可以安装 x64_windows_VS2013 文件夹。谢谢!
  • 更新:在新位置安装了 Visual Studio 2012 并引用了正确的库,但现在我收到一条错误消息:错误 LNK2038:检测到“RuntimeLibrary”不匹配:值 'MD_DynamicRelease ' 不匹配 'MT_StaticRelease'
  • 使用另一组 CPLEX 库。您应该在标记为 stat_mda 和 stat_mta 的文件夹中有库。通常,您可以将已编译的 C++ 代码静态或动态链接到库。如果您静态链接,则库函数的有效副本会被复制并直接包含在您的可执行文件中。如果改为动态链接,则链接到可执行文件的内容是一组对这些函数的引用,然后在运行时链接到 DLL。参见例如stackoverflow.com/questions/7214764/static-vs-dynamic-libraries。
  • (续)在构建 CPLEX 库本身时,它还需要链接到标准运行时库本身。 IBM 提供的不同版本与不同的开发人员可能希望将他们自己的代码链接到其他(标准)运行时库的方式兼容。如果您希望自己的代码使用动态链接来链接到标准运行时库,那么使用以相同方式工作的 CPLEX(和任何其他库)版本是有意义的。
  • 但是,在我的 12.5.1 副本中,我没有看到 VS2012 的 CPLEX 库的静态版本,因此您可能需要更改 VS2012 中的项目设置。阅读 IBM 提供的文件 c_cpp.html 的内容以获取有关设置项目的详细说明,并查看提供的 VS2012 示例项目设置。
【解决方案2】:

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

不存在 VS2013 的 CPLEX 库,因此您不应该花时间寻找一些...这可以在 this report 中看到,您可以从 CPLEX Optimization Studio Detailed System Requirements 访问其他平台/版本。

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

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 2021-12-23
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多