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



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

我使用了以下命令的组合,试图让它发挥作用:

SET DETOURS_TARGET_PROCESSOR=X86
CALL "C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvarsall.bat"  x86
CALL "C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvars32.bat"
NMAKE

然而,这会导致以下错误:

1( 在VCVARSAL:期间

[ERROR:team_explorer.bat] Directory not found : "C:Program Files (x86)Microsoft Visual Studio2017BuildToolsCommon7IDECommonExtensionsMicrosoftTeamFoundationTeam 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

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

相关内容

最新更新