3

最新の LibClang を使用して、いくつかの C ヘッダー ファイルを解析しています。私が処理するコードは、CXUnsavedFile のものです (すべて動的に生成され、ディスク上には何もありません)。例えば:

FileA.h には以下が含まれます。

struct STRUCT_A {
  int a;
  struct STRUCT_B foo;
};

FileB.h には以下が含まれます。

struct STRUCT_B {
  int b;
};

次のコード スニペットで fileA.h を解析する場合:

CXUnsavedFile unsaved_files[2];

unsaved_files[0].Filename = "fileA.h";
unsaved_files[0].Contents = fileA_contents;
unsaved_files[0].Length   = strlen( fileA_contents );

unsaved_files[1].Filename = "fileB.h";
unsaved_files[1].Contents = fileB_contents;
unsaved_files[1].Length   = strlen( fileB_contents );

tu = clang_parseTranslationUnit(
    index,
    "fileA.h",
    argv, // "-x c-header -target i386-pc-win32"
    argc,
    (CXUnsavedFile *)&unsaved_files,
    2,
    CXTranslationUnit_None
);

CXCursor cur = clang_getTranslationUnitCursor( tu );

clang_visitChildren( cur, visitor, NULL );

field has incomplete type 'struct STRUCT_B'構造体 STRUCT_B を定義するために fileB.h をインクルードしていないので、エラー " " が表示されます。

「#include <fileB.h>」を追加しても機能しません ( fatal error: 'fileB.h' file not found)。

1 つ以上の必要な定義が別の CXUnsavedFile fileB.h に存在する場合、fileA.h の解析を機能させるにはどうすればよいですか?

4

1 に答える 1

4

参考になるかわかりませんが、以下の2点をご紹介します。

  1. ドキュメントには明示的に記載されていませんが、Filenameフィールドにはファイルへのフル パスを含める必要があると思います (これは、特にコマンド ラインに「-I」スイッチがある場合に、ファイルを含めるために重要になる可能性があります)。

  2. libclang のドキュメントから(強調は私のものです):

    const char* CXUnsavedFile::Filename


    内容がまだ保存されていないファイル。 このファイルは、ファイル システムにすでに存在している必要があります。

    libclangほとんどすべて(含める正しいファイルの検索、存在の確認など)をファイルシステムに依存していると思われCXUnsavedFile、実際のコンテンツを読み取る必要がある最後のステップで s のみを説明します。

可能であれば、メモリ ファイル システムに空のファイルを作成することをお勧めします。これにより、リソースの使用量が少なくlibclangなり、正しいインクルード ファイルを見つけるのに役立ちます。

于 2013-10-30T22:34:24.150 に答える