【windows+命令行编译】在windows平台通过命令行编译--以开源软件detours为例

detours介绍

[detours的wiki文档](https://documentation.help/Detours/Ove_Interception.htm#:~:text=Control flow of invocation without Detours and with,function%2C and one function pointer%2C the target pointer.)

github下载后的代码目录结构如下,采用的是Makefile的形式来编译。

命令行编译

对应于Linux系统的make命令,在windows平台编译Makefile的命令为nmake
直接打开命令行执行nmake会报错提示找不到该命令,这是因为环境变量中没有设置nmake.exe对应的路径。

nmakecl等命令都是visual studio工具集的一部分,这里就需要了解如何通过命令行来进行编译。

怎么操作

通过命令行使用 Microsoft C++ 工具集
这里摘抄官方文档的介绍,不建议自行设置环境变量,而是建议打开已经配置好的开发人员命令提示快捷方式
MSVC 命令行工具使用 PATH、TMP、INCLUDE、LIB 和 LIBPATH 环境变量,还使用特定于已安装工具、平台和 SDK 的其他环境变量。 即使是简单 Visual Studio 安装,也可以设置二十或更多个环境变量。 这种复杂性是强烈建议使用 开发人员命令提示符快捷方式 或 自定义命令文件之一的原因。 不建议在Windows环境中自行设置这些变量。
以vs2019举例,打开开始菜单的developer command prompt for vs 2019,再次执行nmake命令,就可以发现命令可以找到了。

和普通命令行窗口的差别

官方文档中也有描述, 可在2个命令行界面执行SET命令,然后对比其差异, 可以看到在开发人员命令行界面中,环境变量新增了INCLUDELIBWindows SDK.Net Framework等变量。

x86 or x64

默认的命令行界面是基于x86的, 切换到detours目录下执行nmake编译后,会发现生成的exe全部位于bin.x86目录下,那么如何编译x64的二进制呢?

仍然以vs2019举例, 在xxx\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build下,执行vcvars64.bat.\vcvarsall.bat x64, 就可以切换到x64的编译环境。

这里实际上脚本的调用关系为:

graph LR vcvars64.bat-->vcvarsall.bat vcvarsall.bat-->VsDevCmd.bat

VsDevCmd.bat位于xxx\Microsoft Visual Studio\2019\Community\Common7\Tools路径下,默认执行该脚本就类似于打开developer command prompt for vs 2019
关于脚本之间的调用关系,这篇文档记录的比较详细深入:
记录一次在PowerShell下进入VC编译环境的探索过程

cmd or powershell

通过developer command prompt for vs 2019打开的cmd界面,很多命令都没有,如果能在powershell下进行命令行编译会更加方便。
通过查询其他文档,发现也是有方案的,开始菜单中打开Developer PowerShell for VS 2019就可以了,文档链接如下:
Visual Studio 开发人员命令提示和开发人员 PowerShell
但是这样仍然默认打开的是x86的编译环境,如何在powershell中编译x64的目标进程?文档中提到,需要升级到2022版本,就可以在powershell中打开x64的环境了。

& 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\Common7\Tools\Launch-VsDevShell.ps1' -Arch arm64 -HostArch amd64
posted @ 2022-07-10 17:44  mooooonlight  阅读(578)  评论(0编辑  收藏  举报