【问题标题】:Boost module machine type 'X86' conflicts with target machine type 'x64'Boost 模块机器类型“X86”与目标机器类型“x64”冲突
【发布时间】:2021-11-17 19:42:30
【问题描述】:

我正在 Windows 上构建一个 64 位程序,需要链接到 Boost 库。

我正在成功使用其他 64 位库。

当我构建 boost 时,我使用命令明确指定我需要 64 位库

`.\b2 address-model=64'

它构建了我需要的库:

`libboost-serialization-vc120-mt-s-x64_1_77.lib'

顾名思义,这应该是一个 64 位库。

但是,当我尝试编译我的程序时,我得到了链接错误:

说明: `error LINK1112: 模块机器类型“X86”与目标机器类型“x64”冲突

文件: `libboost-serialization-vc120-mt-s-x64_1_77.lib'

这是怎么回事 - 它是一个 64 位库,为什么它说它与机器类型“x64”冲突,我该怎么办?

【问题讨论】:

  • 您是在 32 位配置下编译自己的项目吗?
  • 不,64 位,已确认(我正在链接到在尝试链接到此之前构建的其他 64 位库),机器类型 'x64' 是 my 程序。我发现一个问题指的是同样的现象:stackoverflow.com/questions/56603575/… 似乎问题在于 boost 构建系统它是 64 位,但实际上是 32 位。但我看不到一个可靠的答案或我可以复制的答案......
  • 您可以使用 dumpbin(在您的 VS 2013 二进制文件中提供)来验证该库是否为 64 位,如此答案:https://superuser.com/a/1658663/76204

标签: c++ boost linker linker-errors


【解决方案1】:

好的,我“想出了”如何解决这个问题。

基本上,我认为正在发生的事情正在发生。尽管指定了 64 位构建并且这些库的名称适合 64 位构建,但它们是使用 32 位工具链构建的。

对于碰巧看到这个的 Boost 的任何人 - 这是一个非常糟糕的体验,应该修复

为了让它正确构建库,我必须运行隐藏在 MSVC 程序文件中的 .bat 脚本,以将环境设置为 64 位 通常的提升过程。

here 所述,这些脚本有多种用于不同目的,尽管令人恼火的是它没有指定在哪里找到它们。

在四处寻找他们之后,我找到了我需要的文件 vcvarsx86_amd64.bat(出于复杂的原因,我使用的是旧版本的 MSVC,它只有 32 位风格,但可以交叉编译 64 位代码)。

对我来说,这是在

中找到的

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat

注意:要使这一切正常工作,这一切都必须在开发人员命令提示符内完成,对我来说,该命令提示符位于

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts

在该命令提示符下,通过键入构建正确的库文件

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat
bootstrap vc12
b2 address-model=64

然后它按预期链接。

免责声明:不必要的意见 - 随时编辑此内容...

来自 *nix 环境,所有这一切看起来都可怕。 Boost 对于 c++ 开发是必不可少的,但是仅仅让它用 MSVC 构建是非常人为的、不透明的,而且只是……坏了。几乎就像它设计让它变得困难一样。你是怎么忍受的?

【讨论】:

  • 我的构建树创建脚本,为编译器和 32/64 调用正确的 vcvars 批处理文件,并将其放在每棵树的根文件夹中。在里面我构建了 boost 并使用 CMake 和我使用的编译器的环境设置。
  • 事后看来这是非常明智的,但问题(让我抱怨)是它没有被包含,没有很好的记录,甚至没有错误检查。需要设置 MSVC 环境设置才能正确构建,而这些设置在 行业标准 CMake 文件和巨大的 boost 构建系统中无法完成。它们根本不是增强构建的选项,也没有提到它们!更糟糕的是,如果工具链与用户指定的构建不匹配,则不会引发错误。它(在我看来)客观上糟糕作为一个系统 - 并不是说​​你不能像你一样做聪明的事情来绕过它。
  • 是的,咆哮有点……主观。是的,MSVC 几十年来一直在继续发布大量这些“开发人员变量批处理文件”,这很糟糕。这几乎不是 Boost 可以修复的,除非他们重申了这一点 MSVC 文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多