gpt4 book ai didi

c++ - 如何在 CLang C++ 下编译/使用头单元模块?

转载 作者:行者123 更新时间:2023-12-04 12:15:46 25 4
gpt4 key购买 nike

文档中说 CLang 中的模块支持是部分的。我在最近发布的 LLVM 12.0 中在 Windows 64 位下使用 CLang。
我成功地使用了常规模块(您通过 import modulename; 导入)。
但是我还没有设法创建和使用标题单元模块,这些模块是通过 import "header.hpp"; 导入的。 .你能建议如何用例子做到这一点吗?
为了尝试标题单元,我创建了下一个玩具文件:
你好.hpp :

#include <vector>
使用.cpp :
import "hello.hpp";

int main() {
std::vector<int> v(123);
}
然后我成功(我希望)编译了头单元 hello.hpp进入PCM文件:
clang++ -std=c++20 -Xclang -emit-header-module -I. hello.hpp -o hello.pcm
命令运行没有错误并产生 hello.pcm .如果你在没有 -o 的情况下运行上面的命令标志然后文件 hello.hpp.gch被 build 。
然后我尝试编译 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 下,我成功地使用了常规模块和标题单元模块。但不是在 Clang 中。你能帮我解决这个问题吗?或者告诉我可能还不支持 CLang header 单元。

最佳答案

最后我设法解决了上面的几乎任务。
以下说明适用于 Windows 64 位、来自 LLVM 12.0 版本的最新 CLang(您可以获得 here)和最新的 MSVC 社区构建工具 2019 v16.9.4(您可以从 here 获得)。
我解决的任务不是完全针对 header 单元,而是针对 header 模块,它们的行为几乎相同,它们的用法没有区别。
玩具示例文件如下:
模块.modulemap :

module mod {
requires cplusplus17
header "mod.hpp"
export *
}
mod.hpp :
#include <iostream>
使用.cpp :
import mod;

int main() {
std::cout << "Hello, world!" << std::endl;
}
我使用了接下来的 3 个命令:
clang++.exe -cc1 module.modulemap -o prebuilt/mod.pcm -emit-module -fmodules -fmodule-name=mod -std=c++20 ^
-internal-isystem "d:\\bin2\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.28.29910\\include" ^
-internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.19041.0\\ucrt" ^
-debug-info-kind=limited -fms-extensions -fms-compatibility -fms-compatibility-version=19.28 -xc++ ^
-fmath-errno -fexceptions -fcxx-exceptions -triple x86_64-pc-windows-msvc || exit /b

clang++.exe -cc1 -emit-obj use.cpp -fmodule-file=prebuilt/mod.pcm -std=c++20 ^
-internal-isystem "d:\\bin2\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.28.29910\\include" ^
-internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.19041.0\\ucrt" ^
-debug-info-kind=limited -fms-extensions -fms-compatibility -fms-compatibility-version=19.28 -xc++ ^
-fmath-errno -fexceptions -fcxx-exceptions -triple x86_64-pc-windows-msvc || exit /b

clang++.exe use.o -o use.exe || exit /b
这一切都没有错误。您可以看到包含标准库目录的完整路径,这些路径特定于我的系统。这是必需的,因为在我使用的命令中 -cc1启用使用低级 CLang 前端而不是简化驱动程序的选项,这个前端需要很多低级选项才能工作。
您只需执行 clang++ -### use.cpp 即可获得所有选项,这将转储到控制台您系统所需的所有选项。
上面的命令可以与 -cc1 一起使用仅前端,驱动程序不支持模块映射文件。
其实上面第二条命令中的3条命令可以简化,编译目标文件不需要低级前端。但只有在第一个命令具有由 clang -### 获得的默认参数的情况下才能简化它命令,那么第二个命令可以简写为 clang++ use.cpp -o use.o -c -std=c++20 -fmodule-file=prebuilt/mod.pcm .
这些命令的结果是 use.o在几分之一秒内编译。据了解, iostream编译需要很多时间。非常快的编译 use.o意味着我们正确使用了模块并提高了速度。
为什么我首先想要标题单元?为了能够升级我的旧代码,只需将常规旧式包含自动替换为导入,即可大大缩短编译时间。这种更换仅适用于集管单元或集管模块。据我所知,常规模块无法导出其他完整标题。
有关模块的更多说明,请参阅 CLang 的 Modules DocCommandLine Doc .

关于c++ - 如何在 CLang C++ 下编译/使用头单元模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67210597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com