为GCC创建正确的D3D11库文件

时间:2014-11-03 20:30:10

标签: c++ gcc directx-11

将DirectX SDK中提供的d3d11.lib等文件转换为* .a GCC库格式的正确方法是什么?我已尝试使用常见的reimp方法将* .lib文件转换为* .a文件,但它似乎无法正常工作。

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

bin\reimp -d d3d11.lib

我想说我想使用应该在这个库中提供的D3D11CreateDevice函数。如果我打开创建的定义文件,一切似乎都没问题:

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

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

bin\dlltool -v -d d3d11.def -l libd3d11.a

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

undefined reference to `D3D11CreateDevice'

如果我问nm库中有哪些符号(并使用grep过滤),我会得到:

D:\Tools\LIB2A>bin\nm 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"即使在定义文件中提到它也不是吗?

2 个答案:

答案 0 :(得分:2)

只是做:

copy d3d11.lib libd3d11.a

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

答案 1 :(得分:0)

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

当使用Microsoft提供的常规d3d11.lib和任何人提供的标头时,在运行时进入库时会发生SIGSEGV。这意味着您必须转换为* .a格式,原因尚未调查。