c++ - 如何使用 Clang++ 生成和使用预编译头文件?

标签 c++ build clang precompile

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/

相关文章:

ios - ITMS 90101 错误上传应用程序

macos - 在命令行 xcodebuild 调用后分发 .app 文件

.net - 有没有更好的方法将 native dll 复制到 bin 文件夹?

debugging - 每次 LLVM 优化(每次传递)后转储 IR,LLVM IR 传递和后端调试

c++ - 这是 Clang 的错误还是我的错误?

c++ - 单个 SetEvent() 可以触发多个 WaitForSingleObject()

c++ - C++中的包装器设计

c++ - SDL_Surface* 作为 C++ 中的构造函数参数

c++ - 这会被认为是糟糕的编程习惯吗?

c++ - 这是编译器错误还是我的代码?