14

Clang と LibTooling を使用して、C++ ソース分析および変換ツールを作成したいと考えています。このチュートリアルに従って Clang と LibToolingを作成しました。作成した Clang バイナリを使用して、いくつかの分析ツールを実行および作成し、C++ プログラムをコンパイルすることができました。ただし、標準ライブラリのヘッダーを (ソース ファイルまたはツールに) 含めると、ソース ファイル/ツールをコンパイルまたは実行するときに問題が発生します。たとえば、次の C++ ソース ファイルに対して clang-check を実行するとします。

#include <iostream>

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

「致命的なエラー: 'iostream' ファイルが見つかりません」というメッセージが表示されます。(注: 標準ライブラリを使用する C++ プログラムではなく、ユーザー定義クラスを含む C++ プログラムをコンパイルできます。) この問題を解決するために、libc++ をビルドしました (このガイドに従って、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 Yosemite 10.10 を実行しており、Clang 3.6.0 を使用しています。

4

4 に答える 4

6

Clang には、いくつかのカスタム インクルードが付属しています。したがって、通常、clang は /usr/bin/clang++ にあり、インクルードは /usr/lib/clang/3.6.1/include にあります。

しかし、clang は相対パスとしてそれらを探します: ../lib/clang/3.6.1/include

したがって、この相対パスが clang++ バイナリまたは libtooling アプリケーションからアクセスできることを確認してください。

于 2015-07-09T19:20:19.523 に答える
3

ツールをこれに含めます。

#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 の後に、代わりに独自のパスを指定できます。

それが誰かを助けてくれることを願っています:)私が十分に具体的でないかどうか尋ねてください。

于 2015-11-13T11:24:33.957 に答える
-3

homebrewを使用し、コマンドを使用して llvm をインストールします。

brew install llvm

あなたの問題は解決されるはずです。

于 2015-07-06T18:43:01.540 に答える