c++ - 为 GCC 创建正确的 D3D11 库文件

标签 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”却没有定义?

最佳答案

就这样做:

复制 d3d11.lib libd3d11.a

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

关于c++ - 为 GCC 创建正确的 D3D11 库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26722643/

相关文章:

c++ - 静态转换为不正确的类型

c++ - 链表中的随机性

eclipse - Eclipse C/C++ 中的发现选项

c++ - gcc:警告:大整数隐式截断为无符号类型

c++ - 在不破坏现有内容的情况下绘制 Present() 钩子(Hook)

c++ - 使用 Directx 9 的屏幕空间反射

c++ - 如何知道何时在 C++ 中调用 delete 以及何时调用 delete[]?

c++ - 如何正确使用 vector 范围构造函数?

c - Xilinx MicroBlaze 浮点兼容性

directx-11 - RenderTargetView 指向的后缓冲区是否会在 Present 之后自动更改?