错误 LNK2038:在 CppFile1.obj 中检测到 '_MSC_VER' 不匹配:值 '1600' 与值 '1700' 不匹配。

72

我正在将我的项目从VS2010转换到VS2012。但是在某些项目中,我遇到了_MSC_VER链接器错误。经过长时间的谷歌搜索,我发现这个问题是由于将在VS2010中创建的库链接到VS2012导致的。

我如何找出哪个项目导致了这个错误? 以下是错误提示:

Error   6   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj      D:\ProjectLocation\Projectname1.lib(CppFile2.obj) Projectname2
Error   15  error LNK2001: unresolved external symbol "private: static void __cdecl std::locale::facet::_Facet_Register(class std::locale::facet *)" (?_Facet_Register@facet@locale@std@@CAXPAV123@@Z)  D:\ProjectLocation\Projectname1.lib(CppFile3.obj)   Projectname2
Error   13  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile4.obj)   Projectname2
Error   12  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile5.obj)   Projectname2
Error   10  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile6.obj)   Projectname2
Error   11  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile7.obj)   Projectname2
Error   9   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile8.obj)   Projectname2
Error   4   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj       D:\ProjectLocation\Projectname1.lib(CppFile9.obj)    Projectname2
Error   14  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile10.obj)  Projectname2
Error   7   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile11.obj)  Projectname2
Error   8   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile12.obj)  Projectname2
Error   5   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile13.obj)  Projectname2
4个回答

96
TL;DR: 重新编译所有旧的静态链接 .lib 文件,使用当前编译器 (VS2012,在 OP 的情况下)。
你正在尝试链接由不同版本编译器编译的对象。现代版本的 VS 不支持这种操作,至少在使用 C++ 标准库时是如此。不同版本的标准库在二进制上不兼容,因此需要将链接器的所有输入都编译为同一版本。确保重新编译要链接的所有对象。
编译器错误中已经命名了涉及到的对象,因此问题的信息已经包含了你正在寻找的答案。具体而言,似乎需要重新编译要链接的静态库。
所以解决方案是使用 VS2012 重新编译 Projectname1.lib。
只有当旧的 .lib 文件没有静态链接并带有已经编译好的 .dll 文件 (或 .exe 文件),或者两个标准库是二进制兼容的情况下,才能链接到旧的 .lib 文件(但在 OP 的情况下它们是不兼容的)。

谢谢您,David,您的意思是问题出在cpp文件上吗?我已经对项目文件进行了所有修改,添加了<PlatformToolset>v110</PlatformToolset>。所以我认为问题可能不在项目文件中,不是吗? - mystack
2
不是,这是目标文件。编译器生成的文件。它们似乎在.lib文件中。你需要重新编译它。 - David Heffernan
你好,David, 我是一个新手C++程序员。我基本上是一个C#程序员。你能否详细说明一下这些注释? - mystack
5
编译器提示你使用VS2012重新编译Projectname1.lib。 - David Heffernan
1
在我的情况下,lib文件甚至无法编译,出现错误“程序数据库文件'vc80.pdb'具有过时的格式,请删除它并重新编译”。我按照编译器的建议去做,现在lib和依赖于lib的项目都可以编译了。 - sergiol
显示剩余2条评论

42

在您的解决方案中,对于每个项目,请确保:

属性 > 配置属性 > 常规 > 平台工具集

对于它们所有的设置都是一致的, Visual Studio 2010 使用 v100, Visual Studio 2012 使用 v110。

您也可以从 Visual Studio 2012 中使用 v100 进行开发。


C#项目的设置在哪里? - sergiol
@sergiol,PlatformToolset 属性是 MSBuild 属性,用于指定 C++ 工具集的版本。因此,该属性与 C# 无关。 - Cary

4

我也将一些项目从VS2010导入到VS2012中。 我遇到了相同的错误。 当我将属性 > 配置属性 > 通用 > 平台工具集设置回v100(VS2010)时,这些错误消失了。 然而,这可能不是正确的方法。


这不应该是一个答案,而是一个新问题。 - drescherjm

3

我从2010升级到2013年,并在更改所有项目的Platform Toolset后,需要右键单击“解决方案”并选择“Retarget ...”才能使其正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接