尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突

Posted

技术标签:

【中文标题】尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突【英文标题】:Trying to compile Detours.lib as 32bit on a 64bit machine: LNK1112: module machine type 'x86' conflicts with target machine type 'x64' 【发布时间】:2020-05-05 00:46:44 【问题描述】:

我正在尝试按照说明编译 Detours。我想编译 32 位版本的库,因为我打算挂钩一个 32 位应用程序。我搜索了答案,但他们似乎解释了显而易见的问题,比如切换到 64 位,但我打算编译为 32 位。

我混合了以下命令,试图让它工作:

SET DETOURS_TARGET_PROCESSOR=X86
CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"  x86
CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
NMAKE

但是这会导致以下错误:

1) 在 VCVARSALL 期间:

[ERROR:team_explorer.bat] Directory not found : "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer"
[vcvarsall.bat] Environment initialized for: 'x86'

2) 在 NMAKE 期间

LIBCMT.lib(chkstk.obj) : fatal error LNK1112: module machine type 'x86' conflicts with target machine type 'x64'

如您所见,尽管我尽了最大努力,但它仍在抱怨目标机器类型。

我还尝试了 vcvarsall x64,与 SET DETOURS_TARGET_PROCESSOR=X86 配对。 (不确定这是否是一个有效的测试)这导致了

iping_d.obj : error LNK2001: unresolved external symbol iping_ProxyFileInfo

请帮助我理解我做错了什么。

当我选择 DETOURS_TARGET_PROCESSOR=X64 时,它编译成功,但它创建了一个 64 位库,我无法在我的 32 位 dll 中使用它。

我还从 VC x86 Native Tools 命令提示符中尝试了所有这些,结果相同。

【问题讨论】:

这能回答你的问题吗? fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86' 【参考方案1】:

我已经在 detours 问题跟踪器上写下了这个问题的答案,这里是:https://github.com/microsoft/Detours/issues/98。

为方便起见,在此转发内容:

我认为这里的问题是您使用错误的配置进行交叉编译。 要在 x64 主机上交叉编译 x86 二进制文件,您需要:

启动“x64_x86 Cross Tools Command Prompt for VS”命令提示符。 设置 DETOURS_TARGET_PROCESSOR=X86

我认为您可能不小心启动了“x86_x64 Cross Tools Command Prompt for VS”命令提示符。 如果我这样做,然后设置 DETOURS_TARGET_PROCESSOR=X86,我可以重现相同的错误。我想如果我对 X64 进行逆向交叉编译,也会发生同样的事情。

命名非常混乱,但您可以通过检查命令提示符中设置的环境变量轻松验证。

x64_x86 跨工具命令提示符:

C:\>set | findstr VSCMD_ARG
VSCMD_ARG_app_plat=Desktop
VSCMD_ARG_HOST_ARCH=x64
VSCMD_ARG_TGT_ARCH=x86

注意:VSCMD_ARGT_TGT_ARCH 等于我们的目标架构,应该等于DETOURS_TARGET_PROCESSOR

x86_x64 跨工具命令提示符:

C:\>set | findstr VSCMD_ARG
VSCMD_ARG_app_plat=Desktop
VSCMD_ARG_HOST_ARCH=x86
VSCMD_ARG_TGT_ARCH=x64

我们可以看到这里的值与我们想要的相反。

【讨论】:

以上是关于尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突的主要内容,如果未能解决你的问题,请参考以下文章

C:在处理 32 位程序时,在 Windows 64 位机器上将 int 转换为 int* 时出现警告

Firefox在64位Windows系统上将默认下载64位

在 64 位机器上编译 32 位:/usr/bin/ld: 找不到 -l<someLibs>

在 OS X 上将 32 位二进制库包装到 64 位库

使用 Microsoft Detours - 一堆未定义的

如何在 IA32 上将带符号的整数相加成更大的和。 32位有符号整数的64位总和?