clang -cc1和系统包括

时间:2013-08-29 09:06:17

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

我有以下文件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设置包含?

3 个答案:

答案 0 :(得分:8)

答案 1 :(得分:8)

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

-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++

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

答案 2 :(得分:1)

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

  

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

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

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

     

如果您想使用仅前端选项(“-cc1选项”),例如-ast-dump,那么您需要获取驱动程序生成的clang -cc1行,添加您需要的选项。或者,您可以运行clang -Xclang <option> ...强制驱动程序[将] ​​<option>传递给clang -cc1

我做了后者(-Xclang)以发出预编译的头文件:

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

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