正在为GCC创建正确的D3D11库文件
Creating correct D3D11 library file for GCC
将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格式,但未进行调查。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- 正在为GCC创建正确的D3D11库文件