正在为GCC创建正确的D3D11库文件

Creating correct D3D11 library file for GCC

本文关键字:D3D11 文件 创建 GCC      更新时间:2023-10-16

将DirectX SDK中提供的d3d11.lib等文件转换为*.a GCC库格式的正确方法是什么?我尝试过将*.lib文件转换为*.a文件的常见重新映射方法,但似乎不起作用。

第一步涉及创建一个定义文件:

binreimp -d d3d11.lib

假设我想使用这个库中应该提供的D3D11CreateDevice函数。如果我打开创建的定义文件,一切似乎都很好:

LIBRARY "d3d11.dll"
EXPORTS
(...)
D3D11CreateDevice
D3D11CreateDeviceAndSwapChain
(...)

接下来,我尝试使用定义文件和原始lib文件创建*.a文件:

bindlltool -v -d d3d11.def -l libd3d11.a

事实上,这确实产生了一个有效的库(当dlltool设置为verbose时,没有错误消息),但如果我试图使用应该在其中实现的函数D3D11CreateDevice,我会得到一个错误:

undefined reference to `D3D11CreateDevice'

如果我问nm库中存在什么符号(以及使用grep的过滤器),我得到的是:

D:ToolsLIB2A>binnm libd3d11.a | grep D3D11CreateDevice
File STDIN:
00000000 I __imp__D3D11CreateDeviceAndSwapChain
00000000 T _D3D11CreateDeviceAndSwapChain
00000000 I __imp__D3D11CreateDevice
00000000 T _D3D11CreateDevice

imp函数是调用DLL中D3D11CreateDevice的实际实现的函数。但是,该实际实现现在以下划线作为前缀。

为什么定义了"_D3D11CreateDevice",而即使在定义文件中提到了"D3D11CreateDevice"也没有定义?

只需执行:

copy d3d11.lib libd3d11.a

或者,在GCC命令行中使用X:pathtod3d11.lib而不是-ld3d11。Windows上的GNU实用程序使用与Microsoft工具相同的PECOFF存档格式。

在转换d3d111lib时,过时版本的dlltool会在每个函数前加一个下划线。使用MinGW-w64 4.9.2中的dlltool.exe解决了此问题。这个dlltool生成一个具有正确函数名的库。

当将Microsoft提供的常规d3d11.lib与任何人提供的头结合使用时,在运行时进入库时将出现SIGSEGV。这意味着,由于某些原因,您必须转换为*.a格式,但未进行调查。