升压模块机器类型“X86”与目标机器类型“x64”冲突

Boost module machine type 'X86' conflicts with target machine type 'x64'

提问人:user3353819 提问时间:9/24/2021 更新时间:9/24/2021 访问量:834

问:

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

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

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

'.\b2 地址模型=64'

它构建了我需要的库:

“libboost-序列化-vc120-mt-s-x64_1_77.lib”

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

但是,当我尝试编译我的程序时,出现链接错误:

描述: “错误LINK1112:模块计算机类型”X86“与目标计算机类型”x64“冲突

文件: “libboost-序列化-vc120-mt-s-x64_1_77.lib”

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

C++ Boost Linker 链接器错误

评论

0赞 user3389943 9/24/2021
您是否正在以 32 位配置编译自己的项目?
0赞 user3353819 9/24/2021
不,64 位,已确认(我正在链接到其他 64 位库,这些库是在尝试链接到这个库之前构建的),机器类型“x64”是我的程序。我发现了一个涉及相同现象的问题:stackoverflow.com/questions/56603575/......似乎问题是 boost 构建系统它是 64 位,但实际上是 32 位。但我看不到一个可靠的答案,也没有一个我可以复制的答案......
0赞 drescherjm 9/24/2021
您可以使用 dumpbin(在 VS 2013 二进制文件中提供)来验证库是否为 64 位,如以下答案所示: https://superuser.com/a/1658663/76204

答:

1赞 user3353819 9/24/2021 #1

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

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

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

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

有各种各样的这些脚本用于不同的目的,详见此处,尽管令人愤怒的是,它没有指定在哪里可以找到它们。

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

对我来说,这是在

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 进行构建就非常人为、不透明,而且......破碎。几乎就像它旨在使它变得困难一样。你如何忍受它?

评论

0赞 drescherjm 9/24/2021
我在我的构建树上,我创建脚本,为编译器和 32/64 调用正确的 vcvars 批处理文件,并将其放在每个树的根文件夹中。在里面,我构建了 boost,并将 CMake 与我使用的编译器的环境设置一起使用。
0赞 user3353819 9/24/2021
事后看来,这是非常明智的,但问题(让我抱怨)是它没有被包含,没有充分的记录,甚至没有错误检查。需要设置 MSVC 环境设置才能获得在行业标准 CMake 文件和巨大的提升生成系统中无法完成的生成。它们根本不是提升构建中的一个选项,也没有任何地方提到它们!更糟糕的是,如果工具链与用户指定的构建不匹配,则不会引发任何错误。在我看来,作为一个系统,客观上是的——并不是说你不能像你一样做聪明的事情来绕过它。
0赞 sehe 9/25/2021
是的,咆哮有点......主观。是的,几十年来,MSVC 一直在继续发布大量这些“开发人员变量批处理文件”,这很糟糕。这几乎是 Boost 可以修复的,除了他们重申了 MSVC 文档的这一点。
0赞 user3353819 9/25/2021
这里根本没有提到这一点:boost.org/doc/libs/1_77_0/more/getting_started/windows.html