2013-10-28 26 views
7

私は、Cのソースコードプロジェクトを基本的に解析するためのツールを書いています。この2つのチュートリアル12は、ubuntu 12.04のclang 3.4(trunk 192426)です。libtoolingはstddef.hや他のヘッダを見つけることができません

offical tutorialに基づいて、それは私が唯一$ ./main -p [path of compile_commands.json]を入力した場合しかし、それは位置引数が不足して文句を言うだろう、-pによってcompile_commands.jsonを渡すことができますと言います。引数としてすべてのファイル名を渡す必要があるようですが、プロジェクトが本当に巨大な場合は実用的ではありません。私は、単に質問することなくcompile_commands.jsonで指定されたすべてのファイルを解析することができますが、それを有効にする方法を見つけることはできません。

CommonOptionsParserのカスタマイズを行うためのチュートリアルが見つからないため、代わりにCompilationDatabaseクラスを使用します。 VisitStmtVisitDeclVisitTypeにはtrueを返すダミーの訪問者がいるので、私はそれをスキップします。 main機能は非常に単純です:

int main(int argc, const char **argv) { 
    string errorMsg = ""; 
    CompilationDatabase *cd = CompilationDatabase::autoDetectFromDirectory (argv[1], errorMsg); 
    ClangTool Tool(*cd, cd->getAllFiles()); 

    int result = Tool.run(newFrontendActionFactory<ExampleFrontendAction>()); 

    return result; 
} 

私はcmakeののgauranteeにcompile_commands.jsonの正しさを(右?)を使用しているので解析するopencvを選択してください。しかし、多くのエラーが表示されます(最後に添付されています)。 LibToolingはstdarg.hstddef.hemmintrin.hを見つけることができません。それはclangのためのFAQですが、それはなぜ起こるのだろうと言いますが、libtoolingを使っている間にそれを解決する方法は述べていません。 clangのためのすべての引数をclang -###に渡して解決できるかもしれませんが、libtoolingを使ってこれらの引数を渡す方法はありますか?

# include <stdarg.h> 
     ^
1 error generated. 
Error while processing /home/jcwu/repos/opencv/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp. 
In file included from /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c:16: 
/home/jcwu/repos/opencv/3rdparty/libjpeg/jinclude.h:35:10: fatal error: 'stddef.h' file not found 
#include <stddef.h> 
     ^
1 error generated. 
Error while processing /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c. 
error: no suitable precompiled header file found in directory '/home/jcwu/repos/opencv/modules/legacy/precomp.hpp.gch' 
1 error generated. 
Error while processing /home/jcwu/repos/opencv/modules/legacy/src/hmmobs.cpp. 
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c:17: 
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/../dsp/../enc/vp8enci.h:17: 
/usr/include/string.h:34:10: fatal error: 'stddef.h' file not found 
#include <stddef.h> 
     ^
1 error generated. 
Error while processing /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c. 
In file included from /home/jcwu/repos/opencv/modules/imgproc/opencv_test_imgproc_pch_dephelp.cxx:1: 
In file included from /home/jcwu/repos/opencv/modules/imgproc/test/test_precomp.hpp:12: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iostream:40: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ostream:40: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ios:39: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iosfwd:42: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/postypes.h:42: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/cwchar:46: 
/usr/include/wchar.h:40:11: fatal error: 'stdarg.h' file not found 
# include <stdarg.h> 

==== ====更新

読むCommonOptionsParser.cppのソースコード。 FixedCompilationDatabaseを使用してCompilationDatabaseを引数の後に推測し、その後に引数を渡します(カスタムの場合はCommonOptionParserの-pのみ)。私の場合、compile_commands.jsonが必要です.CommonOptionsParserを使用してスキップすることができます。

したがって、私の問題は、compile_commands.jsonを持っているときに "clang - ###"からLibToolingにこれらのオプションを渡す方法を減らしますか?私は解析したいすべてのファイルに対してシェルコマンドを呼び出すべきですか?

==== ====更新

私はcompile_commands.jsonが簡単かもしれない変更だと思います。なぜCMakeによって生成されたcompile_commands.jsonに自分のシステムヘッダファイルフォルダが正しく含まれていないのか分かりません。なぜなら、そのCMakeList.txtによって生成されるMakefileは正しくコンパイルできて、どうしてcompile_commands.jsonが多くのことを逃してしまうからです。

答えて

1

誰かが私に言いました、編集データベースは自己完結型でなければならないと言います。まず、compile_commands.jsonがclangを使って生成されていることを確認する必要があります。また、clangを使ってopencvを構築することもできます。

私はその後compile_commands.jsonを再生成し、これらの環境変数

export CC=/home/jcwu/repos/llvm-release/Release/bin/clang 
export CXX=/home/jcwu/repos/llvm-release/Release/bin/clang++ 
export C_INCLUDE_PATH=/usr/local/include:/home/jcwu/repos/llvm-release/Release/lib/clang/3.4/include:/usr/include/x86_64-linux-gnu:/usr/include # these are from clang -v -c files.cpp 
export CPLUS_INCLUDE_PATH=/usr/local/include:/home/jcwu/repos/llvm-release/Release/lib/clang/3.4/include:/usr/include/x86_64-linux-gnu:/usr/include 

を設定し、それがSTDDEF.Hが、新しい問題がアップ私が原因OpenCVのを構築するために打ち鳴らすを使用することはできません

[ 31%] Building CXX object modules/ts/CMakeFiles/opencv_ts.dir/src/ts.cpp.o 
In file included from /home/jcwu/repos/opencv/modules/ts/src/ts.cpp:116: 
/usr/include/setjmp.h:60:12: error: conflicting types for '__sigsetjmp' 
extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) __THROWNL; 
     ^
/usr/include/pthread.h:727:12: note: previous declaration is here 
extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROW; 
     ^
1 error generated. 
make[2]: *** [modules/ts/CMakeFiles/opencv_ts.dir/src/ts.cpp.o] Error 1 
make[1]: *** [modules/ts/CMakeFiles/opencv_ts.dir/all] Error 2 
make: *** [all] Error 2 

来る見つけることができますタイプコンフリクトまたは2つのシステムヘッダーファイル。 Havne'tはこれを解決する方法を考え出しました。

5

pythonバインディングを使用して同様の問題が発生しました。

http://clang.llvm.org/docs/LibTooling.html

の "ヒント" セクションで

[<Diagnostic severity 4, location <SourceLocation file '/usr/include/stdio.h', line 33, column 11>, spelling "'stddef.h' file not found">]

彼らはデフォルトパスは

$(dirname /path/to/tool)/../lib/clang/3.3/include 

それはそうここでの考え方である含まれていることを言及し、それがあるということですあなたのツールは、clang実行可能ファイル自体も入っているbinディレクトリから実行されていると予想されます。通常、これはシステムディレクトリになるので、そこから上に行くとclang/3.4/includディレクトリを含むlibディレクトリがあります。だから私は手動で$(which clang)../lib/clang/3.4/includeをパーサに含めました。 Pythonでは、これはこれは空のリストであることtranslation_unit.diagnosticsが生じ

translation_unit = index.parse("test.cc",["-I/home/archgoon/usr/local/lib/clang/3.4/include"]) 

ようになります。

3

私のケースでは、うんざりでインストールされていても、うんざりしていませんでした。

+0

Spot on!なぜあなたが 'clang'が' clang-tidy'依存関係ではないのか疑問に思います - 後者は前者なしで_run_するかもしれませんが、あなたはそれがなければ何のためにも本当に使うことはできません... – ssc

関連する問題