質問

ヘッダーのみのライブラリの利点は何ですか?そのように、実装を別々のファイルに置くことに反対するのかを書きますか?

役に立ちましたか?

解決

テンプレートを扱う場合は、ヘッダ専用ライブラリが唯一のオプションの場合、状況があります。

ヘッダー専用ライブラリを持つことは、ライブラリが使用される可能性があるさまざまなプラットフォームについて心配する必要がないことを意味します。実装を分けるときは、通常、実装の詳細を非表示にして、ライブラリをヘッダーとライブラリー(lib、またはdllファイル)の組み合わせとしてライブラリを配布します。もちろん、これはサポートを提供するすべての異なるオペレーティングシステム/バージョンに対してコンパイルされなければなりません。

実装ファイルを配布することもできますが、それを使用する前にライブラリをコンパイルするための追加手順を意味します。

もちろん、これはケースバイケース基準に適用されます。たとえば、ヘッダーのみのライブラリは、コードサイズ&コンパイル時間を増加させることがあります。

他のヒント

ヘッダ専用ライブラリの利点:

  • ビルドプロセスを簡素化します。ライブラリを構築する必要はなく、ビルドのリンクステップ中にコンパイル済みライブラリを指定する必要はありません。コンパイルされたライブラリがある場合は、おそらく複数のバージョンを構築したいと思うでしょう.1つはデバッグを有効にしてコンパイルされ、もう1つは最適化が有効になっていて、さらに別のシンボルを削除しました。そして多発プラットフォームシステムのためにさらに多くの場合。

    ヘッダ専用ライブラリの欠点:

    • 大きいオブジェクトファイル。一部のソースファイルで使用されているライブラリーからのすべてのインラインメソッドは、そのソースファイルのコンパイル済みオブジェクトファイル内の弱いシンボル、外出の定義も得られます。これはコンパイラを遅くし、リンカを遅くします。コンパイラはその肥満をすべて生成し、リンカはそれを絞り込む必要があります。

    • より長いコンパイル。上記の括弧の問題に加えて、ヘッダーがコンパイルされたライブラリよりもヘッダー専用ライブラリで本質的に大きいため、コンパイルには時間がかかります。これらの大きなヘッダーは、ライブラリを使用する各ソースファイルに対して解析する必要があります。もう1つの要因は、ヘッダー専用ライブラリ内のそれらのヘッダーファイルが、インライン定義によって必要とされるヘッダ、および必要とされるヘッダーが、コンパイルされたライブラリとして構築されたヘッダーに必要なヘッダーを持っていることです。

    • もっと絡まったコンパイル。ヘッダ専用ライブラリに必要な追加の#includesのため、ヘッダー専用ライブラリとの依存関係がたくさんあります。ライブラリ内のいくつかのキー機能の実装を変更し、プロジェクト全体を再コンパイルする必要があるかもしれません。コンパイルされたライブラリのソースファイルの変更を変更すると、その1つのライブラリソースファイルを再コンパイルし、その新しい.oファイルを使用してコンパイル済みライブラリを更新し、アプリケーションを再リンクすることです。

    • 人間が読むのは難しい。最良のドキュメントでも、テンションのライブラリのユーザーはライブラリのヘッダーを読むことに頼る必要があります。ヘッダー専用ライブラリのヘッダーには、インタフェースの理解方法に入った実装の詳細が入力されています。コンパイルされたライブラリでは、あなたが見るのはインターフェースと簡単な解説であり、それは通常あなたが望むすべてです。それはあなたが望むべきです。ライブラリの使用方法を知るために実装の詳細を知る必要はありません。

私はこれが古いスレッドであることを知っていますが、誰もABIインタフェースや特定のコンパイラの問題を述べました。だから私は思ったと思いました。

これは基本的にあなたの概念に基づいていますあなたの概念に基づいていますあなたの概念に基づいています。ヘッダーとソースファイルを再利用し、すべてのプロジェクトでこれらを再コンパイルすることを考えている場合は、これは実際には適用されません。

基本的にC ++コードをコンパイルして1つのコンパイラでライブラリを構築した場合、ユーザーはそのライブラリを異なるコンパイラまたは同じコンパイラの異なるバージョンで使用しようとします。不適合性

コンパイラベンダは、バージョン間でSTLの実装を変更することがよくあります。 STD :: Vectorを受け入れるライブラリに関数がある場合は、ライブラリがコンパイルされたときにそれらが配置されたときにそのクラスのバイト数が配置されることを期待します。新しいコンパイラのバージョンでは、ベンダーがSTD :: Vectorに効率的な改善を行った場合、ユーザーのコードは異なる構造を持つ可能性があり、その新しい構造をライブラリに渡します。そこからすべてが下り坂になります。これが、ライブラリ境界を介してSTLオブジェクトを渡さないことをお勧めします。 Cランタイム(CRT)型にも同じことが適用されます。

CRTについて話すときに、あなたのライブラリとユーザーのソースコードは一般的に同じCRTとリンクされる必要があります。 Visual Studioでは、マルチスレッドCRTを使用してライブラリを構築すると、ユーザーがマルチスレッドデバッグCRTとのリンクをリンクしている場合、ライブラリが必要なシンボルが見つからない可能性があるため、リンクの問題が発生します。それがどれであったかを覚えていないが、Visual Studio 2015の場合、マイクロソフトは1つのCRT機能をインラインで作った。突然CRTライブラリではなく、リンク時にそれを見つけると予想されるライブラリがもう実行できず、この生成されたリンクエラーが発生しました。その結果、これらのライブラリはVisual Studio 2015と再コンパイルを必要としていました。

Windows APIを使用するが、ライブラリー・ユーザーに異なるUnicode設定を備えた場合は、リンクエラーや奇妙な動作を得ることもできます。これは、Windows APIにUnicodeまたはASCII文字列とマクロ/プロジェクトのUnicode設定に基づいて自動的に使用するマクロを使用する機能があるためです。ライブラリ境界で文字列を渡すと、間違ったタイプである場合は、実行時に物事が壊れます。または、プログラムが最初にリンクしていないことがわかります。

これらのことは、他のサードパーティライブラリ(例えば、固有ベクトルまたはGSL行列)から、ライブラリ境界を越えてオブジェクト/タイプを渡すためにも当てはまります。 3番手ライブラリがあなたのライブラリとあなたのユーザーのコンパイルとあなたのコードをコンパイルするの間でヘッダーを変更した場合、物事は壊れるでしょう。

基本的には安全であるため、ライブラリ境界を渡すことができる唯一のものは、タイプとプレーン古いデータ(POD)で構築されています。理想的には、任意のPODはあなた自身のヘッダーに定義されている構造体にあるべきであり、第三者のヘッダーに頼らないでください。

ヘッダーのみのライブラリを提供する場合、すべてのコードは同じコンパイラ設定でコンパイルされ、同じヘッダーに対抗してこれらの問題の多くが消えます(3番目の部分図書館のバージョンを提供し、ユーザー使用はAPI互換のバージョンを提供します)。 )

しかしながら、編集時間の増加など、上記の否定的なものがある。また、ビジネスを実行している可能性があるので、すべてのソースコード実装の詳細をすべてのユーザーに手に入れたくない場合があります。

主な「利点」は、ソースコードを配信する必要があるということです。 マシンのエラーレポートとコンパイラでエラーレポートが終了します 聞いたことがない。ライブラリが完全にテンプレートされているときは、 多くの選択、しかしあなたが選択をしたとき、ヘッダーだけが通常貧しい人々です エンジニアリングの選択(一方、もちろん、ヘッダーはそれを意味します 統合手順を文書化する必要はありません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top