18

Boostライブラリのドキュメントページには、「ヘッダーのみのライブラリ」と「自動リンク」という2つのカテゴリあります

「 HeaderOnlyLibraries 」はBoostライブラリを使用するためにリンクする必要がないことを意味し、 「AutomaticLinking」はリンクする必要があることを意味すると思います。

しかし、を使用する場合はBoost.Timer、という名前の静的または動的ライブラリtimerlibboost_timer.aおよびlibboost_timer.so.1.48.0Linuxライブラリパスの下にあるこれらへのさまざまなソフトリンク)をリンクする必要があります。これは明らかにの正確なライブラリファイルですBoost.Timer。ライブラリ自体がリンクする必要のある他のライブラリを使用していることは理解できますが、Boost.Systemとに対してリンクする必要もあります。Boost.Chrono

一方、Boostは「自動リンク」Boost.Asioに属することを明確に述べていますが、のような名前のライブラリファイルはありません。asio

では、実際には「ヘッダーのみのライブラリ」または「自動リンク」とはどういう意味ですか?それとも純粋に間違いですか?

4

2 に答える 2

11

あなたが言ったように、「ヘッダーのみのライブラリ」は、ライブラリ全体がヘッダーファイルにあることを意味するので、それ#includeを使用するには1行(または数行)で十分です。リンクは必要ありません。

「自動リンク」とは、ライブラリに(直接または依存関係として)リンクが必要な場合でも#include、適切なライブラリを取り込むために'dファイルが魔法をかけるため、コンパイラ行で指定する必要がないことを意味します。コンパイラーによってサポートされている場合は、自動的に。

たとえば、MSVCコンパイラでは、#pragman comment(lib, "...");を使用します。Borlandコンパイラでは#pragma defineoptions、;などを使用します。

そして最も注目すべきことに、「自動リンク」はGNUコンパイラではサポートされていません。

自動リンクは面倒な場合があり(たとえば、デバッグバージョンとリリースバージョンの混合)、いくつかのプリプロセッサマクロを定義することでそれらを選択的に無効にすることができますBOOST_<libname>_NO_LIB。その場合、手動でリンクする必要があります。

更新:以下のコメントについて:

Boost.Timer「ヘッダーのみのライブラリ」であると主張していますが、libディレクトリにlibファイルがあります。

Boostのドキュメントにエラーがあるようです。実際には、 timerという名前の2つの異なるライブラリがあります。古い、非推奨の、ヘッダーのみのライブラリ<boost/timer.hpp>と、新しい、改善された、よりクールな、自動的にリンク可能なライブラリ<boost/timer/timer.hpp>です。

ただし、何らかの理由で、メインのドキュメントページに古いドキュメントのプロパティが一覧表示されます。

Boost.Asiolibファイルはありません。

メインのBoostライブラリドキュメントページライブラリドキュメントページでは、依存関係のためにAsioが自動リンクとしてリストされていることがわかります。特定の依存関係は他の場所にリストされています:Boost.SystemとBoost.Regex、そして両方とも自動リンクを提供します。

于 2012-08-07T08:33:40.330 に答える
9

あなたはそれをかなり釘付けにしました-ヘッダーのみのライブラリは、そのライブラリのすべてのコードがヘッダーに含まれているライブラリです。したがって、それらを使用するためにライブラリにリンクするのではなく、それらを含めるだけで済みます。

とは言うものの、他のライブラリに依存するヘッダーのみのライブラリを作成することは完全に可能ですが、ヘッダーのみの種類ではない可能性があります。この場合、使用している最初のライブラリについてリンカーに通知する必要はありませんが、 2番目のライブラリについて通知する必要があります。特に、すべてのコードがリンカーがライブラリと見なすものの1つ(たとえば、1つの.libまたは.aファイル)に詰め込まれている場合、ほとんどの場合、違いはなく区別されます(明確にするために:それここでは必ずしもそうではありませんが、とにかく発生する可能性があります)。

于 2012-08-02T01:09:43.290 に答える