2016-11-19 10 views
-2

私はPythonで良いcallgraphプログラムを書いています。そのためにpycparserを使用します。 Pycparserは、抽象構文木を正しく作成するために、cファイルを前処理する必要があります。 私の最初のアプローチは、ファイルに対してgccの-Eオプションだけを使用し、それをpycparserに渡すことでした。 しかし、異なるプロジェクトでは、 "No such file or directory"というエラーが発生します。これは、gccが特定のヘッダーを見つけられないためです。もし私がgcc -E `find | grep "\.c"\`でLinuxカーネルを前処理しようとすると、そのようなフォルダがないので、Linux /プレフィックスを持つもののようないくつかのヘッダーファイルが失われます。ヘッダファイルの場所を渡して正しく前処理するために、gccにいくつかのフラグを追加する必要があるようです。任意のCプロジェクトを前処理する一般的な方法はありますか?任意のCプロジェクトの前処理

また、私はそれが正しく前処理するようになるかと思いますが、同じファンクションの複数のコピーが別々のファイルにあります。関数の元のファイルを特定する方法はありますか?

+0

すべてのソースコードのヘッダーを見つける正しい方法はありません。別のプログラムでは、プリプロセッサのコマンドラインで '-I/path/to/headers'オプションを使って異なるディレクトリセットを指定する必要があります。ありがとうございます。 –

答えて

1

GCCがヘッダーファイルを見つける方法については、コンパイラのコマンドラインスイッチと検索パスの環境変数を少なくとも含んでいる必要があります。

GCCが特定のコンパイルのヘッダーファイルを見つける方法に影響を与える、さまざまなプロジェクトセット構成変数のビルドスクリプトが疑わしいです。そのようなスクリプトの多くは、コマンドラインでマクロ置換を行うため、スクリプトが何をしているのかを知る必要があります。

ビルドコンテキストを設定するmakeスクリプトからCソースファイルを分離すると、GCCは正しいヘッダを見つけられません。それがあなたの問題です。

おそらく、ビルドスクリプトを実行し、GCCへの呼び出しをインターセプトして必要なコンテキストを取得する必要があります。

+0

複雑に聞こえる。たぶん私はこのプログラムをLinuxカーネルのために書くことを試みます。誰かがそれを前処理するgccコマンドで助けてくれますか? gcc -E -nostdinc -I ./include -I ./arch/x86/include/ 'find | grep "\ c"はうまくいきません:( –

+0

@ Mr.Moon Linuxカーネルはこの問題に関してかなり簡単だと思いますか? –

+0

私はこのcallgraphプログラムを書くつもりはLinuxカーネルでした。他の人が他のCプログラムのために使うことができるように汎用的にしたかったのですが、私はカーネルを前処理して、このプログラムだけをカーネルのためだけに書くことができればそれで十分です。 –

関連する問題