如何在 MingW 中编译 directX 教程示例
Posted
技术标签:
【中文标题】如何在 MingW 中编译 directX 教程示例【英文标题】:How do I compile a directX tutorial sample in MingW 【发布时间】:2014-09-23 21:31:32 【问题描述】:我找了又找,没有办法让directX在MingW下编译,我看到其他人成功并试图复制它,但无济于事。我已经阅读过这个类似的问题,但它没有帮助,所以请不要引导我:How to compile a DirectX 11 app in MinGW。
我一直在努力让 MingW 与 directX 合作很长时间,这里是我失败的尝试列表以及我读到的对其他人有用的内容:
下载 MSVC 标头并让 MingW 使用它们 下载MingW-W64并使用它编译 下载 Reubens MingW-W64 并使用它进行编译 下载最新的 MingW 编译器并使用它 下载 TDM-GCC 并使用它。 混合编译器头文件拼命尝试消除错误我听说如果我只是将 directX 标头转储到适当的位置,我至少应该能够在链接器阶段失败,但即使在我这样做之后我也会左右出现语法错误(授予它们中的大部分都消失了。)每个编译器最终都有自己独特的错误,在不同的地方失败,但在其他地方在某些地方失败的地方似乎成功了。到底是怎么回事?为什么完全有效的代码(全部由微软编写)在任何其他编译器处理时突然无法编译?
【问题讨论】:
“完全有效的代码(全部由微软编写)”。 (哈哈。对不起。)Visual Studio 正在做它自己的事情,因为它存在。许多标准语言功能缺乏或实现不佳,相反,MS 引入了大量与标准 C/C++ 不兼容的新关键字等(并且通常与除 VS 本身之外的所有主要编译器不兼容)。并不是说 VS 不好,但“遵循标准”是 MS 做不到的。 具体来说,您要编译哪个 DirectX 教程示例? @RossRidge 我正在尝试编译 basicHLSL 【参考方案1】:不幸的是,DirectX 2010 年 6 月 SDK 中包含的示例远非“完美的有效代码”。他们使用了许多特定于 Microsoft 编译器的扩展。
在我因为本质上没有希望而放弃它之前,我在尝试编译Samples\C++\Direct3D\BasicHLSL
中的示例时发现了以下微软的特定依赖项:
__noop
内在
宏 __min
和 __max
标准函数的各种“安全”版本,如wsprintf_s
和strcpy_s
非标准预处理器令牌粘贴
允许goto
跨变量初始化
__uuidof
运算符
Microsoft 的 DirectX 标头还有一些我没有提到的问题,例如依赖于 Microsoft 的 SAL annotation 宏。可以说这是 MinGW 的失败,因为没有这些 DirectX 标头的兼容版本。
其中一些问题相对容易解决。其他的则比较困难,需要重写样本中不兼容的部分。示例中可能还有更多我没有发现的 Microsoft 依赖项。
最重要的是,如果不首先修改示例和 DXUT 框架以使其更便携,就无法使用 MinGW 或任何其他 GCC 端口编译 DirectX SDK 中包含的示例。
【讨论】:
请注意,在MSDN Code Gallery 上使用这些样本的最新版本可能会更好,因为这些样本使用了清理后的DXUT。我仍然使用 Safer CRT 函数、SAL2 注释和-_uuidof
。也就是说,您可以轻松地将所有 SAL2 注释宏定义为“空白”(如果您不使用 /analyze,这就是 Windows SDK 中的 SAL 标头已经执行的操作),将宏用于更安全的 CRT,然后处理 __uuidof
.或者只使用 VS Express。以上是关于如何在 MingW 中编译 directX 教程示例的主要内容,如果未能解决你的问题,请参考以下文章
MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本