将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"即使在定义文件中提到它也不是吗?
答案 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格式,原因尚未调查。