official docs说明如何通过 -cc1
接口(interface)使用预编译 header ,就像这样生成它们:
$ clang -cc1 test.h -emit-pch -o test.h.pch
并使用它们:
$ clang -cc1 -include-pch test.h.pch test.c -o test.s
问题是 -cc1
接口(interface)太低级,开发人员无法从 CLI 使用。事实上,常规的高级接口(interface)最终调用低级 -cc1
接口(interface),方法是为其提供正确操作所必需的大量参数,例如适当的包含路径对于编译时间系统。没有这些参数,-cc1
接口(interface)就没有工作的祈祷:
$ clang++ -cc1 /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h -emit-pch -o std.pch
/usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33:10: fatal error: 'cassert' file not found
#include <cassert>
^~~~~~~~~
1 error generated.
有没有一种方法可以从高级接口(interface)使用预编译头文件,以便开发人员在日常工作中可以方便地利用此功能?
最佳答案
我不知道为什么 clang
文档没有解释这一点,但确实正如@selbie 推测的那样,可以在不使用 -cc1< 的情况下使用 Clang 预编译 header (PCH)/
.
生成 PCH 文件:
$ clang -c -o big-header.hh.pch big-header.hh <other options>
这是正常的编译命令,除了输入文件具有 .hh
(C++ header )扩展名。 clang
将识别这意味着生成 PCH。或者,如果您不想使用该扩展名(或其他扩展名,如 .H
或 .hpp
,那是明确的 C++)。
你可以看出 big-header.hh.pch
不是目标代码(尽管命令行上有 -c
)因为 file
会说它是“数据”(至少我的版本是这样)而不是目标代码。为了更加确定,请运行 strings big-header.hh.pch |头
。第一行应该是“CPCH”(意思是“Clang PCH”)。
要使用 PCH 文件:
$ clang -c -include-pch big-header.hh.pch <other compile options>
添加-include-pch big-header.hh.pch
是区别于gcc
的关键步骤。 Clang 不会仅仅因为它们的名字就自动获取 PCH 文件。
以上是在 Linux 上使用 Clang+LLVM-14.0.0 测试的。
关于c++ - 如何使用 Clang++ 生成和使用预编译头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885920/