2017-01-04 20 views
2

私はライブラリとしてClangを使用しています。ユーザーの標準ライブラリヘッダーのあるパスを抽出したいと思います。Clangの標準ライブラリのヘッダーの検索パスを抽出するにはどうすればよいですか?

この情報は、コマンドラインツールを使用して抽出できます。たとえば、OSXの場合:

clang -E -v -x c++ /dev/null -fsyntax-only 

... 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/bin/../include/c++/v1 
/usr/local/include 
/usr/local/bin/../lib/clang/3.9.0/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
... 

ただし、私はそれをプログラム的に取得したいと考えています。何かのように:

// (just an example) 
std::vector<std::string> searchPaths = clang::GetTypicalHeaderSearchPaths(); 

この情報はどのように公開されますか?

+0

また、[このスレッド]のSean Silva-2の回答に興味があるかもしれません(http://clang-developers.42468.n3.nabble.com/How-to-determine-clang-s-system- include-dirs-to-set-ASTVisitor-td4029080.html) – samvv

答えて

1

残念ながら、ヘッダー検索パスのセットは、言語、プラットフォーム、コマンドラインオプション、構成時の設定など、多くの要素に依存するため、あまり簡単ではありません。

大量の作業を行うフロントエンドライブラリ内には、HeaderSearch/InitHeaderSearchクラスがあります。 clang::ApplyHeaderSearchOptionsを調べることができます。基本的にはHeaderSearchのインスタンスを埋めることができ、さまざまなヘッダー検索パスを繰り返し処理できます。

+1

はい、これは私自身のケースであることがわかりました。私が見つけたもっとも堅牢な解決法(もっとも効率的ではありませんが)は、 'Driver'クラスを使って' CompilerInstance'を作成し、プロパティを読み込み、インスタンスを破棄することでした。幸運にも、私はこれらのプロパティを一度読むだけです。 – sdgfsdh

+0

@sdgfsdhそれは実際には全く悪くない...チップのおかげで。 – samvv

+0

@sdgfsdh:あなたはあなたがそれをやった方法のソースを投稿することができますか?私はそれが働くように苦労している – samvv

0

他の誰かがこの問題に直面した場合:LLVM 3.9.1では、単にコンパイラインスタンスを作成し、そこからヘッダー検索情報を読み取るだけでは不十分です。 CI.createPreprocessor()を使用してプリプロセッサも作成する必要があります。これは唯一の場所です - 少なくとも3.9.1 - ApplyHeaderSearchOptionsが呼び出され、デフォルトのヘッダー検索ディレクトリを取得する場合は、その関数を呼び出すことが必要です。

その後、から得られたHeaderSearchのヘッダーは、HeaderSearch.system_dir_begin()HeaderSearch.system_dir_end()を使用して読み取ることができます。

どうすればいいのかヒントのために@sdgfsdhに感謝します。

関連する問題