あなたが得ているエラーは次のとおりです。
pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h:40:27: before: __gnuc_va_list
エラーの原因として示された行 ( stdarg.h:40
):
typedef __builtin_va_list __gnuc_va_list;
gcc では__builtin_va_list
、その名前が示すように、コンパイラに組み込まれています。したがって、その型の宣言は必要ありません (または許可されません)。
型名を別の識別子と区別できない場合、文法には多くのあいまいさがあるため、C コンパイラがシンボルテーブルベースの手法を使用して型名を解析することは非常に一般的です。このようなパーサーは、宣言されていない識別子は型名ではないと想定し、型名で__builtin_va_list
ない場合はtypedef
構文エラーです。
したがって、使用している pyparser 文法は gcc の組み込み型について認識していないと思います (そして、なぜそうすべきなのでしょうか?)。
あなたの fakelib には同じヘッダー ファイルが含まれているようです。偽造するのは難しいので、それは驚くべきことではありませんstdarg.h
。技術的にはライブラリ ヘッダーですが、これは、独立した (標準ライブラリではない) 実装であっても、コンパイラによって提供される必要があるヘッダーの小さなセットの一部です: <float.h>, <iso646.h>, <limits.h>, <stdalign.h>,
<stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>
、および
<stdnoreturn.h>
(C11 標準、条項 4、段落 6)。外部ライブラリがコンパイルされたコードの性質を十分に認識して適切に定義する方法がないため、これらはコンパイラによって実装される必要があります。
pyparsed 出力から必要なものに応じて、次のような の定義を含めることにより、pyparser でこれを回避できる場合があります__builtin_va_list
。
typedef struct __builtin_va_list { } __builtin_va_list;
__builtin_va_list
組み込みの gcc データ型は 1 つだけではありませんが、他のデータ型に遭遇することはないかもしれません。したがって、達成しようとしていることを達成するまで、このソリューションを数回繰り返す必要がある場合があります。