UE4 编译代码的真正命令参数

在之前的文章 Build flow of the Unreal Engine4 project 中有提到,UE 编译模块的时候会执行到 ExecuteActions 中。
那么 UE 真正编译每个翻译单元的编译器参数是什么呢?
在 UBT 调用 ExecuteAction 之前,会完成所有编译参数的拼接和预处理。

1
static void ExecuteAction(ManagedProcessGroup ProcessGroup, BuildAction Action, List CompletedActions, AutoResetEvent CompletedEvent)

在 Win 上是通过调用 cl-filter.exe 来执行的,而如何把代码和编译参数喂给编译器呢?
UE 是通过生成了一个 .cpp.obj.response 来记录当前编译单元的信息的,包含编译器参数和包含目录 / 输出等等。

该文件在生成位置在模块的 Intermediate 目录下:

1
Intermediate\Build\Win64\UE4Editor\Development\HotPatcherRuntime\FlibPakReader.cpp.obj.response

文件内容太长,可以下载该文件查看:FlibPakReader.cpp.obj.response

可以使用手动调用 cl.exe 的方式来执行测试:

1
2
cl.exe @CPP_OBJ_RESPONSE_PATH //showIncludes
// "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\cl.exe" @"C:\BuildAgent\workspace\PackageWindows\Client\Plugins\UnLua\Intermediate\Build\Win64\UE4\Development\LuaProtobuf\Module.LuaProtobuf.cpp.obj.response" /showIncludes