official docs说明如何通过-cc1
接口使用预编译头,如下所示以生成它们:
$ clang -cc1 test.h -emit-pch -o test.h.pch
并使用它们:
$ clang -cc1 -include-pch test.h.pch test.c -o test.s
问题是-cc1
接口太低级,开发人员无法从命令行界面中使用。实际上,常规的高级接口最终会调用低级-cc1
接口,方法是为低级接口提供正确操作所需的一组非常大的参数,例如,适用于编译时系统的包含路径。如果没有这些参数,-cc1
接口将无法正常工作:
$ 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.
有没有一种方法可以从高级接口使用预编译头,以便开发人员在日常工作中可以方便地使用此功能?
发布于 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++头文件。
clang -c precomp.hpp
这将生成precomp.hpp.gch
现在,要使用任何其他普通C++文件的预压缩,只需包含普通.hpp
文件:
// main.cpp
#include "precomp.hpp"
void func1() {...}
void main() {...}
如果在原始.hpp文件中存在相应的.gch文件,编译器将自动使用该文件。
https://stackoverflow.com/questions/55885920
复制相似问题