2014-11-23 9 views
13

voglio usare Clang e LibTooling per creare alcuni strumenti di C++ di analisi sorgente e di trasformazione. Ho creato Clang e LibTooling dopo il tutorial this e sono stato in grado di eseguire e creare alcuni strumenti di analisi e compilare programmi C++ utilizzando il binario Clang che ho creato. Tuttavia, se includo le intestazioni dalla libreria standard (nei file di origine o nei miei strumenti), mi imbatto in problemi durante la compilazione o l'esecuzione dei file/strumenti di origine. Per esempio, se corro clang-verifico il seguente file C++ fonte:Come utilizzare libreria standard con Clang e LibTooling

#include <iostream> 

int main() { 
    std::cout << "Hello"; 
    return 0; 
} 

ottengo "errore fatale: file 'iostream' non trovato". (Nota: posso compilare programmi C++, ad esempio quelli con classi definite dall'utente, solo programmi C++ che usano la libreria standard.) Nel tentativo di risolvere il problema, ho creato libC++ (seguendo la guida this, costruendola nel progetto llvm/directory in cui ho creato LLVM e Clang), ma ho ancora problemi con Clang e gli strumenti per usare libC++. Ora, se provo a compilare un file di prova utilizzando:

export CPLUS_INCLUDE_PATH="~/clang-llvm/llvm/projects/libcxx/include" 
export LD_LIBRARY_PATH="~/clang-llvm/llvm/projects/libcxx/lib" 
~/clang-llvm/llvm/build/bin/clang++ ~/Documents/main.cpp 

poi mi "errore fatale: file 'unistd.h' non trovato". Quindi la mia domanda è questa: come faccio a puntare correttamente Clang e i miei strumenti per usare libC++?

Sto facendo funzionare l'OS X Yosemite 10.10 e usando Clang 3.6.0.

risposta

4

Clang viene fornito con alcuni accessori personalizzati. Quindi di solito si è clang in /usr/bin/clang ++ e la include in /usr/lib/clang/3.6.1/include

ma clang sembra per loro come un percorso relativo: ../lib /clang/3.6.1/include

in modo da assicurarsi che questo percorso relativo è accessibile sia dal clangore ++ binario, o l'applicazione libtooling.

-2

Usa homebrew ed installare LLVM utilizzando il comando

brew install llvm 

Il tuo problema dovrebbe essere risolto.

-1

ti sei trasferito/rinominare una delle directory padre dopo la costruzione/installazione? Il compilatore avrebbe dovuto essere configurato per sapere dove cercare le sue librerie standard senza dover specificare i percorsi delle variabili d'ambiente.

2

Inserisci la tua strumento in questo:

#include "clang/Tooling/CommonOptionsParser.h"  // For reading compiler switches from the command line 
#include "clang/Tooling/Tooling.h" 

static cl::OptionCategory MyToolCategory("SearchGlobalSymbols"); 
static cl::extrahelp MoreHelp("\nMore help text...");  // Text that will be appended to the help text. You can leave out this line. 
/* Your code (definition of your custom RecursiveASTVisitor and ASTConsumer) */ 
/* Define class MyASTFrontendAction here, derived from ASTFrontendAction */ 

int main(int argc, const char **argv) 
{ 
    /* Your code */ 
    CommonOptionsParser op(argc, argv, MyToolCategory);      // Parse the command-line arguments 
    ClangTool Tool(op.getCompilations(), op.getSourcePathList());   // Create a new Clang Tool instance (a LibTooling environment) 
    return Tool.run(newFrontendActionFactory<MyASTFrontendAction>().get()); // Run custom Frontendaction 
} 

Il CommonOptionsParser consente di leggere i comandi da riga di comando che sono passati al compilatore. Ad esempio, è ora possibile chiamare il tuo strumento come questo:

your-tool yoursourcefile.c -- -nostdinc -I"path/to/your/standardlibrary" 

Tutto dopo il doppio trattino verrà passato al compilatore. I possibili flag sono descritti qui: http://clang.llvm.org/docs/CommandGuide/clang.html

-nostdinc dice al preprocessore di non cercare i percorsi di inclusione standard. Puoi specificare i tuoi percorsi personali dopo -I.

Speranza ha aiutato qualcuno :) Chiedimi se non sono stato abbastanza specifico.

Problemi correlati