2009-05-03 9 views
3

難しくないでしょうか?右?C関数を定義するヘッダファイルを見つける

私は現在、OpenAFSコードベースをトローリングして、pioctlのヘッダ定義を探しています。私はそれを得ました:チェックctags、pioctlのためのソースコードを盗んだ、など私がリードに持っている事実は、それを除いて、定義を含むファイルpioctl_nt.hがあるという事実です実際に私が望むものではなく、userspaceコードのどれもそれを直接含んでいないので、それはWindows特有のものです。

ここで、OpenAFSコードベースをダウンロードし、私のためのヘッダファイルを見つけることを期待していません。私は好奇心が強いです。他のすべてが失敗したときに必要なヘッダーファイルを見つけるテクニックは何ですか?コード・ベースのpioctlのためのgrepが実際に関数定義のように見えるものにならない最悪のシナリオは何ですか?

私は、それを正しく行った2つの独立したユーザー空間プログラムにアクセスできることにも注意しなければならないので、理論的には関数のO(n)検索を行うことができます。しかし、ヘッダファイルのどれも私に飛び出していない、そしてnは大きいです...

編集:即時問題が解決されました:pioctl()は、このによって示されるように、暗黙的に定義されています

AFS.xs:2796: error: implicit declaration of function ‘pioctl’ 
+0

grep -Rを試してみてください –

+0

私は午前中です!大文字と小文字を区別しない検索も行っています。 –

+0

"解決済み"に関する編集に関して、 "暗黙の宣言"とは、 "コンパイラがスコープのプロトタイプなしでpioctlへの呼び出し(または識別子の使用)を見ている以外のことを意味するとは限りません。 " – Jens

答えて

3

を隠しています失敗した場合、それはおそらくいくつかの厄介な結果として定義されているでしょうマクロ。あなたはpioctl()を呼び出し、正常にコンパイル可能な限り単純なファイルを作成し、次に何が起こるかを見るためにそれを前処理試すことができます。

gcc -E test.c -o test.i 
grep pioctl -C10 test.i 
2

プリプロセッサ出力を表示するコンパイラオプションがあります。それらを試して?私の頭が完全に空であった恐ろしいピンチで、-Eオプション(ほとんどのcコンパイラで)は、前処理されたコードを吐き出すだけです。

要求された情報に基づいて:通常は、画面に出力される問題のファイルのコンパイルをキャプチャするだけで、簡単なコピーと貼り付けを行い、コンパイラ呼び出しの直後に-Eを挿入します。その結果、プリプロセッサの出力が画面に表示され、ファイルにリダイレクトされます。すべてのマクロとばかげたことが既に処理されているので、そのファイルを見てください。

最悪のケースのシナリオ:

  • K & Rスタイルのプロトタイプは
  • マクロは(あなたの答えあたり)定義
  • 暗黙の宣言grep -rctagsがある場合
+0

コンパイルプロセスのどの段階がこれに最も適していますか? –

0

あなたは(SourceForgeから入手可能)cscopeを使用して考えがありますか?

私はかなり成功したいくつかのかなり重要なコードセット(25,000 +ファイル、ファイル内の約20,000行まで)でそれを使用します。古代のSun E450で相互参照を構築するには、ファイルリスト(5〜10分)とそれ以上の長さ(20〜30分)が必要ですが、結果が有用であることがわかります。ほぼ均等古代マック(デュアル1GHz以上PPC 32ビット・プロセッサ)で


、OpenAFSの(1.5.59)、ソースコード上のcscopeの実行は、関数が宣言された場所のかなり多くを思い付く、時々インラインコードで、時にはヘッダーにある。 4949ファイルをスキャンして58 MBのcscope.outファイルを生成するのに数分かかりました。

  • OpenAFSの-1.5.59/srcに/ SYS/sys_prototypes.h
  • OpenAFSの-1.5.59/SRC/aklog/aklog_main.c(コメントと一緒に、 "なぜ、AFSこれらのプロトタイプを提供していません?" )
  • OpenAFSの-1.5.59/SRC/SYS/pioctl_nt.h
  • OpenAFSの-1.5.59/SRC/AUTH/ktc.c PIOCTL
  • OpenAFSの-1.5.59/SRC/SYSの定義を含みます/pioctl_nt.cはその実装を提供します
  • openafs-1.5.59/src/sys/rmtsysc.cはそれの実装を提供します(そして時にはafs_pio

見つかった184のインスタンスの残りの部分は、関数、ドキュメント参照、リリースノート、変更ログなどが使用されているようです。

+0

もし私が/ usr/includeを使ってpioctlを覆い、pioctlについての言及が見つからなければ、cscopeはそれを見つけることもできないと思います。 –

+0

cscopeは、ソースツリーなどの/ usr/include以外の場所を検索します。 pioctl()がオブジェクトファイル内の参照シンボルとして現れるかどうかを確認しましたか?ソース内に(#ifdefなどではコメントアウトされていない)オブジェクトには表示されない場合は、マクロを再定義する必要があります。 –

+0

あなたはグーグルで何をしましたか?単に 'pioctl'を検索するだけで、いくつかの場所でもっともらしい参照が出てくる - より良いもののいくつかは検索の2ページ目(アイテム11..20)にあるように見える。例えば、1つのシステムには 'sys/sys_pioctl.h'があります。また、pioctl()が通常の 'ioctl'の呼び出しとして実装されるかもしれないという提案もあります。 –

-1

通常、マニュアルページの概要では言いませんか?

+0

マンページ?ハハ、あなたは私を笑わせる! OpenAFSにはマンページはありません。 –

0

私たちが決めた現在の作業理論は、プリプロセッサを突き刺しても何も見つけなかったので、OpenAFSは関数のプロトタイプを推論させます。なぜなら、整数を返し、ポインタ、整数、ポインタ、そのパラメータとしての整数私はこれを自分で定義するだけで対処します。

:Excellent!誰もがどこpioctlを定義するヘッダファイルを見つけるために思ってこのページに到達した場合、元の一般的な質問は、回答されているが

AFS.xs:2796: error: implicit declaration of function ‘pioctl’ 
+0

暗黙の関数宣言を禁止するために '-Werror-implicit-function-declaration'フラグを追加するとコンパイルされますか? –

+0

これは、互換性のないmemcpy宣言で失敗しました... –

+0

見つけました!編集を参照してください。 –

0

OpenAFSの現在のリリースでは、私は喫煙銃を見つけました(1.6.7)、pioctlのプロトタイプはsys_prototypes.hで定義されています。しかし、この質問が最初に尋ねられたときに、そのファイルは存在せず、OpenAFSコードツリーの外側から見えるpioctlのプロトタイプは存在しませんでした。

しかし、pioctlのほとんどのユーザーは、ローカルマシンで常にシステムコールを発行するlpioctl( "local" pioctl)を使用したいと思っています。 afssyscalls.hにはこのプロトタイプがあります(最近はsys_prototypes.hもあります)。

最近、最も簡単なオプションは、libkopenafsを使用することです。そのためには、kopenafs.hをインクルードし、関数k_pioctlを使用し、-lkopenafsとリンクします。これは、OpenAFSのlibsysや他のものとリンクしようとするよりはるかに便利なインターフェースになる傾向があります。

関連する問題