12

我有以下文件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

4

3 回答 3

9

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

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

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

我还添加了

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

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

于 2014-07-04T14:09:36.393 回答
8

这是一个常见问题

于 2013-08-29T09:12:30.190 回答
4

@john 是正确的。对于后代,常见问题解答的相关部分是(调整名称以匹配问题):

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

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

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

例如,如果您想使用仅前端选项(“a -cc1option”),-ast-dump则需要使用clang -cc1驱动程序生成的行并添加您需要的选项。或者,您可以运行clang -Xclang <option> ...以强制驱动程序 [to] 传递<option>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但没有驱动程序通常提供的其他选项。

于 2017-07-08T14:05:39.647 回答