DirectX Agility SDK 的 GUID 应如何定义和链接?
结论
通常继续链接 Windows SDK 的 dxguid.lib 即可。Agility SDK 头文件会声明接口并包含相关 GUID 信息,但这些信息不代表运行时 DLL 导出了对应的 GUID 符号。不要假定能从 D3D12Core.dll 或 d3d12SDKLayers.dll 获取这些符号。
如果不想链接 dxguid.lib,可以在一个专用的 .cpp 文件中生成所需的 GUID 定义。只需在一个编译单元中启用 INITGUID,然后包含声明这些 GUID 的头文件。
方案一:链接 dxguid.lib
IID_IDXGIAdapter4、IID_ID3D12CommandList 等 GUID 可以由 Windows SDK 的 dxguid.lib 提供。使用 Agility SDK 的头文件和运行时,也可以采用这种链接方式:GUID 是供代码引用的常量标识符,运行时 DLL 则提供相应组件的实现。
如果项目已经通过 dxguid.lib 正确解析这些符号,通常保留这种方式最简单,也无需自行生成定义。
方案二:在一个源文件中生成 GUID
如果不想链接 dxguid.lib,可以专门建立一个源文件来生成 GUID 定义,例如:
// guid_definitions.cpp
#define INITGUID
#include <initguid.h>
#include "../../../ThirdParty/OpenSource/Direct3d12Agility/include/d3d12.h"
#include "../../../ThirdParty/OpenSource/Direct3d12Agility/include/dxgi1_6.h"
确保相关头文件展开 DEFINE_GUID 时,INITGUID 已经生效。这样宏会生成定义,而不是普通声明。其他源文件可以正常包含所需头文件并引用 GUID,但不要再用相同方式生成另一份定义。
能否从 Agility SDK DLL 中获取 GUID?
只有 DLL 明确导出的符号,才能通过 GetProcAddress 按名称获取。GUID 出现在头文件中,并不能说明它也是 D3D12Core.dll 或 d3d12SDKLayers.dll 的导出符号;问题中也没有说明这些 DLL 提供了此类导出。因此,应用应使用链接库或自行定义 GUID,不要把运行时 DLL 当作 GUID 符号库。
注意事项
- 如果采用
INITGUID,请把生成工作集中在一个.cpp文件里。多个编译单元重复生成定义可能导致链接问题,具体行为也会受头文件宏和链接器处理影响。 - 只包含项目实际需要的接口头文件,避免为了生成少数 GUID 引入不必要的头文件。
- 如果链接报错,先核对 GUID 名称是否有对应定义、
dxguid.lib是否参与链接,以及INITGUID是否在头文件之前生效。
备注:内容仅供参考。
