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
接口的级别太低,无法由CLI的开发人员使用。实际上,常规的高级接口最终会通过为其提供正确的操作所必需的非常大的一组参数(例如,适合于编译时的include路径)来调用低级-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.
是否可以使用高级界面中的预编译头,以便开发人员可以在日常工作中方便地利用此功能?
答案 0 :(得分:0)
我认为问题的根源在于文件名是test.h
,而clang则认为您是在编译C代码,而不是C ++代码。因此,当您包含<cassert>
时,clang不知道它应该查看C ++包含路径。尝试命名文件test.hpp
。您只需使用.hpp
将所需文件命名为precomp标头即可。您可以将所有头文件的扩展名保留为.h
。
在任何情况下,我都可能将其与gcc / g ++混淆,但是只要在Mac上编译代码,Clang都会遵循相同的行为。这就是我利用预编译头文件的方式。继续阅读...
如果您有要预编译的C ++头文件,只需将其编译为其他任何.cpp文件即可。请注意,我使用.hpp
作为文件扩展名,因此编译器将其选择为C ++头文件。
clang -c precomp.hpp
这将产生precomp.hpp.gch
现在可以通过其他任何普通的C ++文件使用precomp,只需包含普通的.hpp
文件即可:
// main.cpp
#include "precomp.hpp"
void func1() {...}
void main() {...}
如果存在相应的.gch文件,则编译器将自动使用该文件代替原始.hpp文件。