尝试在 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'

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

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

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

但是这会导致以下错误:

1) 在 VCVARSALL 期间:

[ERROR:team_explorer.bat] Directory not found : "C:\Program Files (x86)\Microsoft Visual Studio17\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 命令提示符中尝试了所有这些,结果相同。

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

为方便起见转载于此:

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

  • 启动“x64_x86 VS 的交叉工具命令提示符”命令提示符。
  • 设置DETOURS_TARGET_PROCESSOR=X86

我认为您可能不小心启动了“x86_x64 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

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