2014-11-23 17 views
13

Ich möchte Clang und LibTooling verwenden, um einige C++ - Quellenanalyse- und Transformationstools zu erstellen. Ich habe Clang und LibTooling nach this Tutorial erstellt, und ich war in der Lage, einige Analyse-Tools zu starten und zu erstellen und C++ - Programme mit der Clang-Binärdatei zu kompilieren, die ich gebaut habe. Wenn ich jedoch Header aus der Standardbibliothek (entweder in Quelldateien oder in meinen Tools) einfüge, stoße ich beim Kompilieren oder Ausführen der Quelldateien/Tools auf Probleme. Zum Beispiel, wenn ich Klirren-Check auf der folgenden C++ Quelldatei ausführen:Verwendung der Standardbibliothek mit Clang und LibTooling

#include <iostream> 

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

I ": 'Iostream' Datei nicht gefunden fatale Fehler" erhalten. (Hinweis: Ich kann C++ - Programme kompilieren, zB solche mit benutzerdefinierten Klassen, nur keine C++ - Programme mit der Standardbibliothek.) Um das Problem zu lösen, habe ich libC++ (nach this) erstellt und im llvm/project erstellt Verzeichnis, in dem ich LLVM und Clang erstellt habe, aber ich habe immer noch Probleme mit Clang und den Tools, libC++ zu benutzen. Nun, wenn ich versuche, eine Testdatei zu kompilieren mit:

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 

Dann bekomme ich „fatale Fehler:‚unistd.h‘Datei nicht gefunden“. Meine Frage ist also: Wie weise ich Clang und meine Werkzeuge richtig darauf hin, libC++ zu benutzen?

Ich verwende OS X Yosemite 10.10 und benutze Clang 3.6.0.

Antwort

4

Clang wird mit einigen benutzerdefinierten enthalten. So haben in der Regel Sie klirren in /usr/bin/Klirren ++ und enthält in /usr/lib/clang/3.6.1/include

aber Klirren sucht sie als relativer Pfad: ../lib /clang/3.6.1/include

so stellen Sie sicher, dass dieser relative Pfad von der Clang ++ - Binärdatei oder Ihrer Libtooling-Anwendung aus zugänglich ist.

-2

Verwenden Homebrew und installieren llvm den Befehl

brew install llvm 

Ihr Problem sollte gelöst werden.

-1

Haben Sie nach dem Erstellen/Installieren eines der übergeordneten Verzeichnisse verschoben/umbenannt? Der Compiler sollte so konfiguriert sein, dass er weiß, wo er nach seinen Standardbibliotheken suchen muss, ohne die Pfade der Umgebungsvariablen angeben zu müssen.

2

Fügen Sie Ihrem Werkzeug in diese:

#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 
} 

Die CommonOptionsParser ermöglicht es Ihnen, Befehle von der Kommandozeile zu lesen, die an den Compiler übergeben werden. Zum Beispiel können Sie jetzt Ihr Werkzeug wie folgt aufrufen:

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

Alles nach dem Doppelstrich wird an den Compiler übergeben werden. Mögliche Flags werden hier beschrieben: http://clang.llvm.org/docs/CommandGuide/clang.html

-nostdinc weist den Preprozessor an, nicht nach Standard-Include-Pfaden zu suchen. Sie können stattdessen eigene Pfade hinter -I angeben.

Hoffe es half jemand :) Fragen Sie mich, wenn ich nicht spezifisch genug war.