【问题标题】:How do I generate and use precompiled headers with Clang++?如何使用 Clang++ 生成和使用预编译头文件?
【发布时间】:2019-09-17 01:10:00
【问题描述】:

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 中的开发人员使用。事实上,常规高级接口最终调用低级-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.

有没有办法从高级界面使用预编译的头文件,以便开发人员可以在日常工作中方便地利用此功能?

【问题讨论】:

    标签: c++ build clang precompile


    【解决方案1】:

    我认为您的问题的根源是您的文件名是 test.h 并且 clang 认为您正在编译 C 代码,而不是 C++ 代码。因此,当您包含 &lt;cassert&gt; 时,clang 不知道它应该查看 C++ 包含路径。尝试将您的文件命名为test.hpp。您只需使用 .hpp 将您想要的文件命名为 precomp 头文件。您可以保留所有带有.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() {...}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2010-09-08
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多