2013-08-29 10 views
6

Ho il seguente file foo.cpp:clang -cc1 e sistema include

#include <vector> 

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

Si può essere compilato con successo con clang (sto usando clangore 3.3 su Ubuntu 13.04 a 32 bit):

clang++ -c foo.cpp 

ora voglio stampare AST:

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

e ho ottenuto il seguente errore

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

Sembra clang++ -cc1 non sapere di sistema includono file, ecc Mi chiedo come impostare include per clang++ -cc1?

risposta

7

È necessario impostare la giusta includere percorsi. sul mio sistema ho aggiunto

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

alle opzioni del compilatore. Il primo è stato in modo che potesse trovare bit/C++ config.h Naturalmente il 4.8 è dovuto al fatto che sto usando un compilatore compatibile con g ++ - 4.8

Ho anche aggiunto

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

come opzioni del compilatore. Spero che questo aiuti

+0

Prova anche a cambiare "-stdlib = libstdC++" in "-lstdC++", ad esempio "clang -x C++ -std = C++ 11 -lstdC++ -Wall input.cpp -o output" – robor78

0

@john è correct. Ai posteri, le porzioni rilevanti del FAQ sono (con nomi ottimizzato per abbinare la domanda):

clang -cc1 è il frontend, clang è il driver. Il driver richiama il frontend con opzioni appropriate per il tuo sistema. Per visualizzare queste opzioni, eseguire:

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

Alcune opzioni della riga di comando Clang sono opzioni del driver solo, alcuni sono opzioni frontend-only. Le opzioni solo front-end sono pensate per essere utilizzate solo dagli sviluppatori clang. Gli utenti non dovrebbero eseguire direttamente clang -cc1, perché le opzioni -cc1 non sono garantite come stabili.

Se si desidera utilizzare l'opzione frontend-only (“opzione -cc1”), ad esempio -ast-dump, allora avete bisogno di prendere la linea clang -cc1 generato dal driver e aggiungere l'opzione desiderata. In alternativa, è possibile eseguire clang -Xclang <option> ... per forzare il driver a [passare] <option> a clang -cc1.

ho fatto il secondo (-Xclang) per l'emissione di intestazioni precompilate:

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

Senza la -Xclang, clang++ ignorato il -emit-pch.Quando ho provato -cc1, ho avuto lo stesso problema dell'OP — clang++ accettato -emit-pch ma non disponevo delle altre opzioni fornite normalmente dal driver.