web-dev-qa-db-ja.com

従属静的ライブラリでBoostをリンクする方法

MS Visual C++ 2010の場合

私のソリューションには、ブーストを使用して完全に機能する単一のC++プロジェクトがありました。

次に、このプロジェクトを静的ライブラリに変換し、この静的ライブラリに依存する新しいプロジェクトを作成することにしました。

ここで、変換された静的ライブラリはエラーや警告(コンパイラーとリンカー)なしでビルドされますが、新しいプロジェクトはコンパイルされますがリンクされません。

私は得ています:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib'

テストとして、このライブラリのリンカオプションに完全なディレクトリパスを追加しました...

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib'

これで、すべてのライブラリへの完全なパスが追加され、ビルドおよび実行されます。

私はこの解決策に満足していません。

  1. ライブラリのユーザーがブーストでのリンクについて心配する必要はありません。
  2. 乱雑です

答えはDLLを作成することですが、静的にこれを行い、静的ライブラリレベルでリンクを維持する方法はあります。

編集:

ブーストライブラリを明示的に無視するように.exeリンカーに指示した場合、.exeがブーストについてまったく心配する必要がないことを除いて、問題ありません。

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib"
21
T33C

どうやら.libsは必要ありません。exeもリンクなしでリンクするからです。ブーストヘッダーのみのメソッドとクラスを使用しているようです。プロジェクトでプリプロセッサシンボルBOOST_ALL_NO_LIBを定義して、自動リンクを無効にするようにboostに指示するだけです。

すべてのboostを含めることで.libを不必要に大きくしたい場合、この質問は答えを持っているようです(私は実際には自分で試したことはありません)。 静的ライブラリを他の静的ライブラリにリンクする

26
user52875

ライブラリを構築するときに、boostライブラリを含めることができます。そのためには、VisualStudioのLibrarian > Generalプロパティページで、ブーストライブラリをAdditional Dependenciesとしてリストします。

ただし、クライアントがboost自体を使用し、静的にそれにリンクする場合(特に、使用しているバージョンとは異なるバージョン)、問題が発生する可能性があります。

4
Daniel Gehriger

ブーストライブラリをビルドしましたか?コンパイルする必要があるBoostの特定のライブラリがあります。まだ行っていない場合は、Boostライブラリのビルド方法を「 Windowsで始める 」を参照してください。

EDIT-1:Boostは、静的ライブラリと動的にロード可能な(dll)ライブラリの両方として構築できます。

EDIT-2:すでにBoostを構築している場合は、@ Daniel Gehrigerの回答で、VSに追加する方法を説明しています。

1
yasouser