【问题标题】:Creating correct D3D11 library file for GCC为 GCC 创建正确的 D3D11 库文件
【发布时间】:2014-11-06 17:31:11
【问题描述】:

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

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

bin\reimp -d d3d11.lib

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

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

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

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

这实际上会产生一个有效的库(当 dlltool 设置为详细时没有错误消息),但是如果我尝试使用应该在其中实现的函数 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”,即使在定义文件中提到了?

【问题讨论】:

    标签: c++ gcc directx-11


    【解决方案1】:

    只要做:

    copy d3d11.lib libd3d11.a

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

    【讨论】:

    • 知道这一点可以节省我一整天的工作时间。谢谢!
    • 所以我尝试直接使用 .lib 文件。编译和链接都很好,但是一旦我进入库,我就会遇到分段错误。看来*lib文件毕竟不兼容。
    • 库是兼容的,否则它不会链接。我按原样使用了 DirectX SDK 库,没有任何问题。你的问题在别处。您是否使用 DirectX SDK 标头?我不认为 Direct3D 11 标头与 GCC 兼容,因此无论您使用什么(或您为使它们兼容所做的任何事情)都可能没有声明您正确使用的函数。
    • 我目前正在将 MinGW-w64 D3D11 标头与 2010 年 6 月 DirectX SDK 中的库结合使用。
    • 为什么不直接使用 MinGW-w64 库?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多