Visual Studio 的 /experimental:module 与 Vulkan 的核心冲突,导致语法错误 - 编译失败



一点转发消息:由于我受限于我能够使用的标签数量,所以我选择了标签visual-studio尽管这至少涉及Visual Studio 2015最小值,这不太令人担忧,因为这更侧重于使用Visual Studio 2017Visual Studio 2019,语言版本设置为C++17C++20


我注意到这些版本的Visual StudioVulkan v1.1之间存在特殊的冲突

如果一个人正在构建一个基于Vulkan的应用程序,并且他们碰巧打开了编译器标志:/std:c++latest/experimental:module

从这里找到的文档:

  • docs.microsoft/experimental-module
  • docs.microsoft/modules

并尝试编译和/或链接到Vulkan库,由于上述冲突而失败。

有一个

来自vulkan_core.h的重大故障,因为他们定义的一些结构有一个名为module的成员,可以从他们的规范表中看到:khronos/vulkan/specs/1.1-extensions...

在结构Vulkan'sVkPipelineShaderStageCreateInfo他们定义如下:

typedef struct VkPipelineShaderStageCreateInfo {
VkStructureType                     sType;
const void*                         pNext;
VkPipelineShaderStageCreateFlags    flags;
VkShaderStageFlagBits               stage;
VkShaderModule                      module;
const char*                         pName;
const VkSpecializationInfo*         pSpecializationInfo;
} VkPipelineShaderStageCreateInfo;

包含一个名为moduleVkShaderModule,这与编译器标志冲突Visual Studio's/experimental:module因为这会使module成为C++17和/或C++20语言中的keyword

此功能在Visual Studio 2017Visual Studio 2019中可用,我不是 100% 确定,但我认为它也在Visual Studio 2015中可用,因为我认为这是Microsoft引入它的时候。


这里有一个简短的主题、主题或讨论: https://developercommunity.visualstudio.com/content/problem/556929/enabling-modules-causes-syntax-error-in-vulkan-cor.html 他们提到正在调查中,但我没有看到比我发现的更多关于这个话题的信息。

我什至试图先在这里搜索,看看是否有任何提及它,但我的搜索结果没有结果。因此,我决定将此问题发布为对其他用户的更多认识和参考,因为我认为这是一个需要解决的重要问题,因为Vulkan正在成为流行的3D图形和计算API工具。


所以对于我关于这个问题的问题:

  • 除了提到的内容之外,还有其他后续行动吗?
  • 除了disablingVisual Studio编译器功能之外,还有其他解决方法吗?
  • 负责处理Vulkan库的责任将落在哪里:负责库的The Khronos GroupLunarGMicrosoft因为他们将此功能添加到他们的compiler中,或者这会与实际C++ Standard有关?
  • 另外,module是否会被视为标准C++语言中的实际key word,或者这是一个Microsoft特定的事情?
  • 其他编译器(如gccClang(是否受此影响?

我问这一系列问题是为了从整个社区获得整体反馈。

我还希望看到其他人为这篇文章做出贡献,添加与此特定主题相关和/或相关的其他讨论、计划和可能解决方案的链接,使其成为C++社区所有读者的参考页面!

  • 除了提到的内容之外,还有其他后续吗?

vulkan 的公共问题跟踪器有一个主题:https://github.com/KhronosGroup/Vulkan-Docs/issues/568

解决方法是module将成为上下文关键字,因此编译器不应对其给出错误。

  • 除了禁用Visual Studio编译器功能之外,还有其他解决方法吗?

您可以编辑 vulkan 标头,成员字段的名称对于正确操作无关紧要。

  • 照顾这件事的责任会落在哪里。

Microsoft需要修复他们的编译器。

  • 另外,模块是否会被视为标准C++语言中的实际关键字,或者这将是一个Microsoft特定的东西?

这将是一个上下文关键字。

  • 其他编译器(如 gcc 或 Clang(是否受此影响?

如果他们正确实现了上下文关键字,那么他们就不会受到影响。

最新更新