首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Clang++中生成和使用预编译头?

如何在Clang++中生成和使用预编译头?
EN

Stack Overflow用户
提问于 2019-04-28 08:07:03
回答 1查看 1.4K关注 0票数 2

official docs说明如何通过-cc1接口使用预编译头,如下所示以生成它们:

代码语言:javascript
运行
复制
$ clang -cc1 test.h -emit-pch -o test.h.pch

并使用它们:

代码语言:javascript
运行
复制
$ clang -cc1 -include-pch test.h.pch test.c -o test.s

问题是-cc1接口太低级,开发人员无法从命令行界面中使用。实际上,常规的高级接口最终会调用低级-cc1接口,方法是为低级接口提供正确操作所需的一组非常大的参数,例如,适用于编译时系统的包含路径。如果没有这些参数,-cc1接口将无法正常工作:

代码语言:javascript
运行
复制
$ 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.

有没有一种方法可以从高级接口使用预编译头,以便开发人员在日常工作中可以方便地使用此功能?

EN

回答 1

Stack Overflow用户

发布于 2019-04-28 08:40:40

我认为问题的根源在于你的文件名是test.h,而clang认为你是在编译C代码,而不是C++代码。因此,当您包含<cassert>时,clang不知道它应该查看C++包含路径。尝试将文件命名为test.hpp。您只需使用.hpp将您想要的文件命名为预压片头。您可以保留所有带有.h扩展名的头文件。

在任何情况下,我可能会将这与gcc/g++混淆,但每当我在Mac上编译代码时,Clang都会遵循相同的行为。这就是我使用预编译头文件的方式。继续往下读。

如果您有一个想要预编译的C++头文件,只需像编译任何其他.cpp文件一样编译它。注意,我使用.hpp作为文件扩展名,因此编译器将其作为C++头文件。

代码语言:javascript
运行
复制
clang -c precomp.hpp

这将生成precomp.hpp.gch

现在,要使用任何其他普通C++文件的预压缩,只需包含普通.hpp文件:

代码语言:javascript
运行
复制
// main.cpp
#include "precomp.hpp"

void func1() {...}
void main() {...}

如果在原始.hpp文件中存在相应的.gch文件,编译器将自动使用该文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55885920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档