C++ 如何在clangc+下编译/使用头单元模块+;?

C++ 如何在clangc+下编译/使用头单元模块+;?,c++,clang,c++20,c++-modules,C++,Clang,C++20,C++ Modules,文档中说模块在CLang中的支持是局部的。我正在使用LLVM 12.0最新版本的64位Windows下的CLang 我成功地使用了常规模块(通过import modulename;导入) 但是我还没有创建和使用header单元模块,这些模块是通过import“header.hpp”导入的。你能举出例子来说明如何做到这一点吗 为了尝试页眉单位,我创建了下一个玩具文件: 你好。hpp: #include <vector> import "hello.hpp"; i

文档中说模块在CLang中的支持是局部的。我正在使用LLVM 12.0最新版本的64位Windows下的CLang

我成功地使用了常规模块(通过
import modulename;
导入)

但是我还没有创建和使用header单元模块,这些模块是通过
import“header.hpp”导入的。你能举出例子来说明如何做到这一点吗

为了尝试页眉单位,我创建了下一个玩具文件:

你好。hpp

#include <vector>
import "hello.hpp";

int main() {
    std::vector<int> v(123);
}
module mod {
    requires cplusplus17
    header "mod.hpp"
    export *
}
#include <iostream>
import mod;

int main() {
    std::cout << "Hello, world!" << std::endl;
}
命令运行时没有出现错误,并生成了
hello.pcm
。如果您在没有
-o
标志的情况下运行上述命令,则
hello.hpp.gch
已创建

然后我尝试编译
use.cpp
,但没有成功,不知何故它无法识别我的头单元和/或无法找到相应的
hello.pcm
。我想我缺少了一些特殊的标志,这些标志显示编译器是头单元。使用了下一个命令:

clang++ -std=c++20 -fprebuilt-module-path=. -fmodule-file=hello.hpp=hello.pcm -I. use.cpp
这导致编译错误:

use.cpp:1:8: error: header file "hello.hpp" (aka './hello.hpp') cannot be imported because it is not known to be a header unit
import "hello.hpp";
       ^

在MSVC下,我成功地使用了常规模块和头单元模块。但不是叮当作响。你能帮我吗?或者告诉我可能还不支持叮当声标题单元。

最后我设法解决了上面的几乎所有任务

下面的说明适用于Windows 64位、LLVM 12.0版本的最新版本(您可以从中获得)和最新的MSVC社区构建工具2019 v16.9.4(您可以从中获得)

我解决的任务并不完全针对头单元,而是针对头模块,它们的行为几乎相同,在使用上并没有区别

玩具示例文件如下:

模块模块映射

#include <vector>
import "hello.hpp";

int main() {
    std::vector<int> v(123);
}
module mod {
    requires cplusplus17
    header "mod.hpp"
    export *
}
#include <iostream>
import mod;

int main() {
    std::cout << "Hello, world!" << std::endl;
}
现代水电站

#include <vector>
import "hello.hpp";

int main() {
    std::vector<int> v(123);
}
module mod {
    requires cplusplus17
    header "mod.hpp"
    export *
}
#include <iostream>
import mod;

int main() {
    std::cout << "Hello, world!" << std::endl;
}
这一切都没有错误。您可以看到,包含标准库目录的完整路径,这些路径特定于我的系统。这是必要的,因为我在命令中使用了
-cc1
选项,该选项启用了低级别的叮当声前端而不是简化的驱动程序,该前端需要大量低级别选项才能工作

您只需执行
clang++-####use.cpp即可获得所有选项,这将转储到控制台系统所需的所有选项

上述命令只能与
-cc1
前端一起使用,驱动程序不支持模块映射文件

实际上,在上述三个命令中,第二个命令可以简化,编译对象文件不需要底层前端。但是,只有在第一个命令具有通过
clang-####
命令获得的默认参数的情况下,它才能被简化,然后第二个命令可以被短写为
clang++use.cpp-o use.o-c-std=c++20-fmodule file=prebuild/mod.pcm

这些命令的结果是
use.o
在几分之一秒内编译完成。众所周知,
iostream
需要大量时间来编译。非常快速地编译
use.o
意味着我们正确地使用了模块并提高了速度

为什么我一开始就想要头球单位?为了能够升级我的旧代码,只需用导入自动替换常规的旧样式include,即可大大缩短编译时间。此更换仅适用于收割台装置或收割台模块。据我所知,常规模块无法导出其他完整标题

有关模块的更多说明,请参阅CLang's和