2013-08-29 3 views
6

У меня есть следующий файл foo.cpp:лязг -cc1 и система включает в себя

#include <vector> 

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

Это может быть успешно скомпилирован с лязгом (я использую лязг 3.3 на Ubuntu 13.04 32bit):

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?

ответ

7

Вы должны установить право включать пути. на моей системе я добавил

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

с флагами компилятора. Первый из них был так, что он может найти бит/с ++ config.h Конечно 4,8 это связано с тем, я использую компилятор совместимый с г ++ - 4,8

Я также добавил

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

как параметры компилятора. Надеюсь, что это поможет

+0

Также попробуйте изменить «-stdlib = libstdC++» на «-lstdC++», то есть «clang -x C++ -std = C++ 11 -lstdC++ -Wall input.cpp -o output» – robor78

0

@john is correct. Для потомков, соответствующие участки FAQ являются (с названиями переделаны, чтобы соответствовать вопрос):

clang -cc1 является интерфейс, clang является драйвером. Драйвер вызывает интерфейс с параметрами, подходящими для вашей системы. Чтобы увидеть эти параметры, запустите:

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

Некоторые лязгом параметры командной строки драйвера только варианты, некоторые из них во внешнем интерфейсе только варианты. Параметры только для Frontend предназначены для использования только разработчиками 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, но не имела других параметров, которые обычно предоставляет драйвер.

Смежные вопросы