私は、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クラスを使用します。 VisitStmt
、VisitDecl
、VisitType
には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.h
、stddef.h
、emmintrin.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が多くのことを逃してしまうからです。
Spot on!なぜあなたが 'clang'が' clang-tidy'依存関係ではないのか疑問に思います - 後者は前者なしで_run_するかもしれませんが、あなたはそれがなければ何のためにも本当に使うことはできません... – ssc