5

LinuxのC++で「.a」ファイルが生成されるように静的ライブラリを作成した場合、私(または他の誰か)はどのようにライブラリを使用しますか?たとえば、私のライブラリはクラスを定義しています。「.a」ファイルを提供するだけでなく、ヘッダーファイルを提供するだけでは不十分だと思います。「.a」ファイルでどのヘッダーファイルを提供する必要があるかを知るにはどうすればよいですか?

たとえば、ライブラリのコードのどこかに含まれているすべてのヘッダーファイルを提供する必要がありますか?

4

4 に答える 4

5

ヘッダー ファイルは、クラスと関数の「宣言」を提供します。これらはコンパイラによって必要とされるため、a) 正しいパラメーターを渡していること、および/またはクラス/構造体の正しいデータ メンバーを設定していることを検証し、b) これらの関数を呼び出す方法を知ることができます。

void do_something(int a, std::string& s);

は、この関数が anintと aの 2 つのパラメーターを想定していることをコンパイラーに伝えますstring&。これにより、正しいタイプのパラメーター (言語レベルの構成要素) を渡していることが検証され、コンパイルされたライブラリ内のオブジェクト コードが何を期待しているかが説明されます (2 つの引数 - 呼び出し規約によってどのように決定されるか)。

そのコンパイル済みライブラリが別のライブラリのコードを使用している場合、それらのヘッダーは作成したコードとは関係がないため、提供する必要はありません。ライブラリは、"アプリケーション プログラミング インターフェイス" (API) ではなく、"アプリケーション バイナリ インターフェイス" (ABI) レベルで動作します。つまり、ポインターなどを渡しているだけです。C 型のパラメーターではありません。

于 2012-12-16T07:50:49.963 に答える
2

「.a」ファイルでどのヘッダーファイルを提供する必要があるかを知るにはどうすればよいですか?

通常、ユーザーにアクセスを許可する機能を説明するすべてのヘッダーファイル。これは、

コードのどこかに含まれているすべてのヘッダーファイルを提供する必要がありますか

通常は「いいえ、公開しません」です。公開していない内部/プライベートヘッダーが存在する可能性があります。

于 2012-12-16T07:43:23.923 に答える
2

ヘッダー ファイルの技術的な理由は、ユーザーコードのコンパイル中にコンパイラに名前サイズを知らせて、ユーザー オブジェクトのレイアウトを調整できるようにするためです。

これが、パブリックprivateクラスのメンバー(ここでは強調: publicがキーワードではないことに注意してください) をヘッダーで公開する必要がある理由です。

実際のインスタンスは結果のユーザー オブジェクト自体に残らないため、公開された部分にレイアウトされたクラスをポインターまたは参照としてのみ公開することを回避できます。その場合、名前だけを宣言できます。

実質上、ユーザーにすべての宣言を提供する必要があります。

  • ユーザーコードにアクセスする必要があります
  • ユーザーオブジェクトのサイズと構成に何らかの形で貢献します(ユーザーの直接の知識がなくても)。
于 2012-12-16T07:58:16.083 に答える
1

クラスを使用したい場合は、クラスの名前をすでに知っていると思います。その場合、クラスが定義されているヘッダーを検索して含めることができます。

于 2012-12-16T07:43:12.830 に答える