2014-11-23 17 views
13

Chcę używać Clang i LibTooling do tworzenia narzędzi do analizy i transformacji źródeł C++. Zbudowałem Clang i LibTooling po tutorialu this i byłem w stanie uruchomić i stworzyć narzędzia do analizy i kompilować programy w C++ przy pomocy zbudowanego binarnie Clang. Jednakże, jeśli dołączę nagłówki ze standardowej biblioteki (w plikach źródłowych lub moich narzędziach), napotkam problemy podczas kompilowania lub uruchamiania plików/narzędzi źródłowych. Na przykład, jeśli biegnę szczęk sprawdzić na poniższym pliku C++ źródło:Jak korzystać z biblioteki standardowej za pomocą Clanga i LibToolinga

#include <iostream> 

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

otrzymuję „błąd krytyczny:«»iostream pliku nie znaleziono”. (Uwaga: mogę skompilować programy w C++, np. Z klasami zdefiniowanymi przez użytkownika, po prostu nie w programach w C++ przy użyciu biblioteki standardowej). Próbując rozwiązać ten problem, zbudowałem bibliotekę libC++ (zgodnie z przewodnikiem this, budując go w bibliotece Llvm/Project katalog, w którym zbudowałem LLVM i Clang), ale nadal mam problemy z uzyskaniem Clanga i narzędzi do używania libC++. Teraz, gdy próbuję skompilować plik testowy używając:

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 

Potem dostać „błąd krytyczny:«unistd.h»plik nie znaleziono”. Moje pytanie brzmi: jak właściwie wskazać Clanga i moje narzędzia, aby używać biblioteki libC++?

Używam systemu OS X Yosemite 10.10 i używam Clang 3.6.0.

Odpowiedz

4

Clang pochodzi z niektórych niestandardowych obejmuje. Więc zwykle masz dzyń w /usr/bin/brzękiem ++ i obejmuje w /usr/lib/clang/3.6.1/include

ale dzyń wygląda dla nich jako ścieżkę względną: ../lib /clang/3.6.1/include

więc upewnij się, że ścieżka względna jest dostępna z pliku binarnego clang ++ lub z aplikacji do libtoolingu.

-2

Zastosowanie homebrew i zainstalować za pomocą polecenia llvm

brew install llvm 

Twój problem powinien zostać rozwiązany.

-1

Czy przeniesiono/zmieniłeś nazwę katalogu nadrzędnego po zbudowaniu/zainstalowaniu? Kompilator powinien być skonfigurowany tak, aby wiedział, gdzie szukać standardowych bibliotek bez konieczności określania ścieżek zmiennych środowiskowych.

2

Dołącz narzędzie do tego:

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

CommonOptionsParser pozwala czytać polecenia z linii poleceń, które są przekazywane do kompilatora. Na przykład, można teraz połączyć się narzędziem tak:

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

Wszystko po podwójnym myślnikiem zostaną przekazane do kompilatora. Możliwe flagi są opisane tutaj: http://clang.llvm.org/docs/CommandGuide/clang.html

-nostdinc mówi preprocesorowi, aby nie szukał standardowych ścieżek dołączania. Możesz podać własne ścieżki zamiast -I.

Mam nadzieję, że pomógł komuś :) Zapytaj mnie, czy nie byłam wystarczająco konkretna.

Powiązane problemy