一点转发消息:由于我受限于我能够使用的标签数量,所以我选择了标签visual-studio
尽管这至少涉及Visual Studio 2015
最小值,这不太令人担忧,因为这更侧重于使用Visual Studio 2017
或Visual Studio 2019
,语言版本设置为C++17
或C++20
。
我注意到这些版本的Visual Studio
和Vulkan 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's
VkPipelineShaderStageCreateInfo
他们定义如下:
typedef struct VkPipelineShaderStageCreateInfo { VkStructureType sType; const void* pNext; VkPipelineShaderStageCreateFlags flags; VkShaderStageFlagBits stage; VkShaderModule module; const char* pName; const VkSpecializationInfo* pSpecializationInfo; } VkPipelineShaderStageCreateInfo;
包含一个名为module
的VkShaderModule
,这与编译器标志冲突Visual Studio's
/experimental:module
因为这会使module
成为C++17
和/或C++20
语言中的keyword
。
此功能在Visual Studio 2017
和Visual 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工具。
所以对于我关于这个问题的问题:
- 除了提到的内容之外,还有其他后续行动吗?
- 除了
disabling
Visual Studio
编译器功能之外,还有其他解决方法吗? - 负责处理
Vulkan
库的责任将落在哪里:负责库的The Khronos Group
或LunarG
,Microsoft
因为他们将此功能添加到他们的compiler
中,或者这会与实际C++ Standard
有关? - 另外,
module
是否会被视为标准C++
语言中的实际key word
,或者这是一个Microsoft特定的事情? - 其他编译器(如
gcc
或Clang
(是否受此影响?
我问这一系列问题是为了从整个社区获得整体反馈。
我还希望看到其他人为这篇文章做出贡献,添加与此特定主题相关和/或相关的其他讨论、计划和可能解决方案的链接,使其成为C++社区所有读者的参考页面!
- 除了提到的内容之外,还有其他后续吗?
vulkan 的公共问题跟踪器有一个主题:https://github.com/KhronosGroup/Vulkan-Docs/issues/568
解决方法是module
将成为上下文关键字,因此编译器不应对其给出错误。
- 除了禁用Visual Studio编译器功能之外,还有其他解决方法吗?
您可以编辑 vulkan 标头,成员字段的名称对于正确操作无关紧要。
- 照顾这件事的责任会落在哪里。
Microsoft需要修复他们的编译器。
- 另外,模块是否会被视为标准C++语言中的实际关键字,或者这将是一个Microsoft特定的东西?
这将是一个上下文关键字。
- 其他编译器(如 gcc 或 Clang(是否受此影响?
如果他们正确实现了上下文关键字,那么他们就不会受到影响。