【问题标题】:C++ / Boost Filesystem - mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600'C ++ / Boost文件系统-检测到'_MSC_VER'不匹配:值'1700'与值'1600'不匹配
【发布时间】:2012-09-06 02:25:34
【问题描述】:

我是 C++ 和 Boost 的新手。我正在做一个简单的小程序来尝试学习 Boost Filesystem 库。我已按照指示构建 Boost 库。现在,当我尝试编译这个简单的代码时,我得到了 6 个这样的错误。

错误 5 错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”与 App.obj C:\SOURCE\ConsoleApp2\ConsoleApp2\libboost_filesystem-vc110-mt-gd-1_51.lib(codecvt_error_category)中的值“1600”不匹配.obj) ConsoleApp2 错误 1 ​​错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”与 App.obj C:\SOURCE\ConsoleApp2\ConsoleApp2\libboost_filesystem-vc110-mt-gd-1_51.lib 中的值“1600”不匹配(操作.obj) ConsoleApp2 错误 2 错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”与 App.obj C:\SOURCE\ConsoleApp2\ConsoleApp2\libboost_filesystem-vc110-mt-gd-1_51.lib 中的值“1600”不匹配(路径.obj) ConsoleApp2 错误 3 错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”与 App.obj C:\SOURCE\ConsoleApp2\ConsoleApp2\libboost_filesystem-vc110-mt-gd-1_51.lib(path_traits) 中的值“1600”不匹配.obj) ConsoleApp2 错误 4 错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”与 App.obj C:\SOURCE\ConsoleApp2\ConsoleApp2\libboost_filesystem-vc110-mt-gd-1_51.lib(windows_file_codecvt)中的值“1600”不匹配.obj) ConsoleApp2 错误 6 错误 LNK1104: 无法打开文件 'libboost_filesystem-vc100-mt-gd-1_51.lib' C:\SOURCE\ConsoleApp2\ConsoleApp2\LINK ConsoleApp2

我在 ConsoleApp2 项目中 App.cpp 中的代码

#include <iostream>
#include <boost/filesystem.hpp>

using namespace std;
using namespace boost::filesystem;

int main(void) 
{
    path p = "C:\\TestFiles";
    cout << is_directory(p);

    return 0;
}

我正在尝试使用 Visual Studio 2010 编译应用程序。我在网上找到的一些信息与 VS 2012 相关。我认为这不适用于我。我想尝试解决5个不匹配错误和最终链接错误。我希望最后一个错误与之前的 5 个有关。

【问题讨论】:

  • 可能在构建库时,您应该将toolset 选项指定为10.0。由于是用VS 2012编译的,默认采用11.0。这会强制库仅与 VS 2012 一起使用。这不是我的经验。如果您希望在 VS 2010 中使用它,请将工具集选项指定为 10.0,这样库就会正确构建。
  • 这里有非常相似的回答问题:stackoverflow.com/questions/19575747/…

标签: c++ visual-studio boost boost-filesystem


【解决方案1】:

libboost_filesystem-vc110-mt-gd-1_51.lib 是使用 VS 2012(也称为 VC 11.0)构建的库,如命名约定中的 vc110 所示。此库无法与使用 VS 2010(也称为 VC 10.0)构建的对象正确链接。

如果您想使用 VS 2010 构建程序,则需要获取或构建 VS 2010 的 boost 库。

【讨论】:

  • 用于各种版本的 MSVC 的预构建 boost 库的通常引用源是:boost.teeks99.com
  • 在没有安装 vs2012 的情况下如何构建它?我按照这里的说明进行操作:boost.org/doc/libs/1_35_0/more/getting_started/windows.html 但没有传入 --toolset 参数。我应该使用 --toolset=msvc=10.0 重新运行 bjam
  • 刚刚注意到这也是@Mahesh 对这个问题的评论。
  • 你确定你没有安装VS2012吗?在系统的命令窗口中运行set vs11 说明了什么?您是否从可能有预建库的地方下载了 boost?
  • boost.teeks99.com 具有用于 boost 1.51 的 vc11 构建的库。有一条评论说它们“不受支持”,但链接的消息表明不受支持的补丁看起来非常良性。次要免责声明:我没有尝试过。
【解决方案2】:

使用文本编辑器打开*.vcxproj 文件。

找到并删除&lt;_ProjectFileVersion&gt;元素,然后保存文件。

例子,

</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
  <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>

  <_ProjectFileVersion>11.0.30319.1</_ProjectFileVersion> <--- Delete this element

</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

然后再次重建解决方案。您将看到项目编译成功。

【讨论】:

  • 我的项目vcxproj文件没有这个标签!我还有什么其他选择?
【解决方案3】:

我试图编译 Teamcenter ITK C++ 代码并得到相同的错误消息:

错误 LNK2038:检测到“_MSC_VER”不匹配:值“1700”不匹配 在 itk_main.obj 中匹配值 '1600'

我所做的解决方法是搜索位于 c 中某处的 msvcprt.lib: (使用everything.exe搜索,可以在voidtools.com上找到)

在 NP++ 或文本编辑器中打开该文件,搜索关键字 _MSC_VER 并将值 /FAILIFMISMATCH:"_MSC_VER=1700" 更改为 /FAILIFMISMATCH:"_MSC_VER=1600"

是的,我能够编译。

【讨论】:

    【解决方案4】:

    vignesh naidu 提到的解决方案对我有用。

    但不完全是 msvcprt.lib

    在错误消息中查找 .lib 文件。

    就我而言,有 somefile.lib , 我在文件资源管理器中搜索了文件夹中的两个相似文件

    1) 发布 2)调试

    在调试文件夹中打开 somefile.lib,在 NP++ 中打开,找到并替换 例如:在我的情况下,1700 和 1900(VS 2015)

    重新编译,中提琴错误消失了。

    关于为什么,其他用户给出的几个技术原因的简要说明。

    PS:我在 VS2015 中编译 VS 2012 中的代码,1700 是 VS 2012 的编译器版本,1900 是 VS 2015 的编译器版本

    【讨论】:

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