我在试着按照指令编译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本机工具命令提示符中尝试了所有这些,结果都是一样的。
发布于 2020-08-21 05:18:39
我已经写了一个关于绕行问题跟踪器的问题的答案,在这里:https://github.com/microsoft/Detours/issues/98。
为了方便起见,在这里重新发布了内容:
我认为这里的问题是,您使用了错误的配置交叉编译。要在x86主机上交叉编译x64二进制文件,您需要:
DETOURS_TARGET_PROCESSOR=X86
我认为您可能意外地启动了“VS的x86_x64交叉工具命令提示符”命令提示符。如果我这样做,然后设置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我们在这里可以看到,这些值与我们想要的完全相反。
https://stackoverflow.com/questions/61603994
复制相似问题