2014-11-23 60 views
13

我想使用Clang和LibTooling來創建一些C++源代碼分析和轉換工具。我已經在this教程中構建了Clang和LibTooling,並且我已經能夠運行並創建一些分析工具並使用我構建的Clang二進制文件編譯C++程序。但是,如果我包含標準庫中的頭文件(無論是源文件還是我的工具),編譯或運行源文件/工具時都會遇到問題。舉例來說,如果我運行下面的C++源文件鐺檢查:如何在Clang和LibTooling中使用標準庫

#include <iostream> 

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

我碰到一個「致命的錯誤:沒有發現‘iostream的’文件」。 (注意:我可以編譯C++程序,例如使用用戶定義的類的程序,而不是使用標準庫的C++程序。)爲了解決這個問題,我構建了libC++(在this指南中,將其構建在llvm/project中我建立LLVM和Clang的目錄),但是我仍然無法獲得Clang和使用libC++的工具。現在,如果我嘗試使用以下代碼編譯測試文件:

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 

然後我得到「致命錯誤:找不到'unistd.h'文件」。所以我的問題是:我如何正確指出Clang和我的工具使用libC++?

我正在運行OS X優勝美地10.10和使用Clang 3.6.0。

回答

4

鏗鏘帶有一些自定義包括。所以平時你鐺在 的/ usr/bin中/鐺++ 和 /usr/lib/clang/3.6.1/include

的包括但鐺尋找他們作爲一個相對路徑: ../lib /clang/3.6.1/include

所以確保這個相對路徑可以從clang ++二進制文件或libtooling應用程序訪問。

-2

使用使用命令

brew install llvm 

你的問題自制並安裝LLVM應該得到解決。

-1

您在構建/安裝後移動/重命名任何父目錄嗎?編譯器應該已經被配置爲知道在哪裏尋找它的標準庫而不必指定環境變量路徑。

2

包括你的工具到這個:

#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可以讀取從被傳遞到編譯器的命令行命令。 例如,你現在可以打電話給你的工具,這樣的:雙破折號會被傳遞到編譯後

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

一切。可能的標誌描述如下: http://clang.llvm.org/docs/CommandGuide/clang.html

-nostdinc告訴預處理程序不尋找標準包含路徑。您可以在-I之後指定您自己的路徑。

希望它幫助別人:)問我,如果我不夠具體。

相關問題