2

一般的な仮説上の問題を詳しく説明します。

問題:

静的ライブラリ saylibX.aとヘッダー ファイルa.hb.h. ヘッダー ファイルa.hb.hは、ライブラリによってエクスポートされた API が含まれています。をa.h含みます。ただし、ライブラリによって非公開で使用されるデータ構造が含まれており、所有者がこれらのデータ構造を公開したくないため、ライブラリの所有者によって出荷されません。a1.hb.hb1.ha1.hb1.ha1.hb1.h

ライブラリによってエクスポートされた API を呼び出すアプリケーションを作成する必要があります。そのため、API の宣言を含むa.handを含める必要があります。b.h

いいよ。アプリケーションを作成し、ヘッダー ファイルa.hをインクルードしb.h、API を呼び出します。しかし、コンパイラはandによって内部的に含まれているa1.handを見つけることができないため、コンパイラ エラーが発生します。b1.ha.hb.h

質問:

  1. この問題の解決策はありますか? はいの場合、真剣に解決策を知りたい:)

  2. ライブラリの所有者は、自分のライブラリで内部的に使用しているすべてのプライベート ヘッダー ファイルを公開する必要がありますか?

4

2 に答える 2

2

最後のものから始めます。ライブラリの所有者は、プライベートな情報を含むヘッダーを隠すことができますが、パブリック ヘッダーがそれらのプライベートなヘッダーに依存しないようにする必要があります。つまり、それらを含めてはなりません!

最初の質問については、これらの include 行を削除してみてください。コンパイルする必要がありますが、そうでない場合は、作成者がプライベート ヘッダーに重要なものを隠している可能性があります。これは、自分以外の誰かがライブラリを使用するために不可欠なものです。

于 2012-06-24T14:47:37.563 に答える
0

1)nmツールを見ることができます。 SO: how to list symbols in a so-file を参照してください。おそらく、静的ライブラリでも機能する可能性がありますが、わかりません。

2) ライブラリの所有者は、John Lakos による大規模な C++ ソフトウェア設計の手法を使用して、内部構造の公開を防ぐことができたはずです。おそらく、そこにあるテクニックを使用して、持っていない情報に頼ることなく、 の必要な部分a1.hを作成できます。b1.h特に、内容を定義せずに構造体/クラスを宣言する。

于 2012-06-24T14:57:18.413 に答える