我正试图按照指令编译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
我们可以在这里看到,这些值与我们想要的相反。