【问题标题】:clang -cc1 and system includesclang -cc1 和系统包括
【发布时间】:2013-09-01 15:06:57
【问题描述】:

我有以下文件foo.cpp

#include <vector>

struct MyClass
{
  std::vector<int> v;
};

可以用clang成功编译(我在Ubuntu 13.04 32bit上使用的是clang 3.3):

clang++ -c foo.cpp

现在我想打印 AST:

clang++ -cc1 -ast-print foo.cpp

我遇到了以下错误

foo.cpp:1:10: fatal error: 'vector' file not found
#include <vector>
         ^
struct MyClass {
};
1 error generated.

看起来clang++ -cc1 不知道系统包含文件等。 我想知道如何为clang++ -cc1 设置包含?

【问题讨论】:

    标签: c++ clang include-path abstract-syntax-tree


    【解决方案1】:

    您需要设置正确的包含路径。 在我的系统上我添加了

    -I/usr/include/i386-linux-gnu/c++/4.8 -I/usr/include/c++/4.8 
    

    到编译器标志。第一个是这样它可以找到 位/c++config.h 当然 4.8 是因为我使用的是与 g++-4.8 兼容的编译器

    我也加了

    -std=c++11 -stdlib=libstdc++
    

    作为编译器选项。 希望这会有所帮助

    【讨论】:

    • 也可以尝试将“-stdlib=libstdc++”改为“-lstdc++”,即“clang -x c++ -std=c++11 -lstdc++ -Wall input.cpp -o output”
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      @john 是correct。对于后代,FAQ 的相关部分是(调整名称以匹配问题):

      clang -cc1 是前端,clang 是驱动程序。驱动程序使用适合您系统的选项调用前端。要查看这些选项,请运行:

      $ clang++ -### -c foo.cpp
      

      一些 clang 命令行选项是仅限驱动程序的选项,一些是仅限前端的选项。仅前端选项仅供 clang 开发人员使用。用户不要直接运行clang -cc1,因为-cc1选项不能保证稳定。

      如果您想使用仅前端选项(“-cc1 选项”),例如 -ast-dump,则需要使用驱动程序生成的 clang -cc1 行并添加您需要的选项。或者,您可以运行 clang -Xclang &lt;option&gt; ... 强制驱动程序 [to] 将 &lt;option&gt; 传递给 clang -cc1

      我使用后者 (-Xclang) 来发出预编译的标头:

      /usr/bin/clang++ -x c++-header foo.hpp -Xclang -emit-pch -o foo.hpp.pch <other options>
                                             ^^^^^^^
      

      没有-Xclangclang++ 忽略了-emit-pch。当我尝试 -cc1 时,我遇到了与 OP 相同的问题 — clang++ 接受了 -emit-pch 但没有驱动程序通常提供的其他选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 2012-02-17
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        相关资源
        最近更新 更多