Clang无法导入子模块咨询:std.vector及自定义子模块均失败
Clang 5-6版本嵌套模块导入问题的解答
你碰到的这个问题是Clang在5.x到6.x版本中对嵌套模块导入支持的已知限制,属于早期模块系统实现的不完善之处,具体情况和解决方案如下:
问题本质
在Clang 6.0.0、5.0.2以及6.0.1-rc1这些版本里,模块系统还没完全实现C++标准中定义的嵌套模块导入语法:
- 无法直接用
import std.vector;这种方式导入标准库的子模块,只能通过import std;导入整个顶层标准库模块 - 对于你自定义的嵌套模块(比如
test.sub),同样没法直接导入子模块,必须导入顶层的test模块才能访问其中的符号
有意思的是,Clang此时已经能识别子模块里的符号归属,所以会出现“提示符号在子模块中,但却无法导入子模块”的矛盾情况,这是当时实现的一个典型表现。
官方相关说明
这个功能缺失是当时Clang模块系统的已知问题,官方在后续版本(比如Clang 7及以上)中完善了嵌套模块的导入支持,之后的版本就可以正常导入子模块了。
当前版本的临时解决办法
在你现在使用的Clang版本里,有两个可行的临时方案:
- 直接导入整个顶层模块,比如
import std;或者import test;,之后直接使用子模块中的符号(比如std::vector或者foo) - 如果想要缩小导入的符号范围,可以把嵌套的子模块拆成独立的顶层模块,而不是嵌套在父模块下
内容的提问来源于stack exchange,提问作者user9303491
相关产品推荐
相关产品推荐

