2011-01-19 17 views
18
私はブーストを使用し、完全に働いた私の溶液中の単一のC++のプロジェクトを持っていたMSのVisual C++ 2010

依存静的ライブラリにブーストをリンクする方法

このプロジェクトをスタティックライブラリに変換し、このスタティックライブラリに依存する新しいプロジェクトを作成することにしました。

私の変換された静的ライブラリはエラーと警告(コンパイラとリンカー)なしでビルド しかし、新しいプロジェクトはコンパイルされますがリンクされません。私はこのライブラリのリンカオプションに完全なディレクトリ・パスを追加試験として

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を作成することです知っているが、静的にこれを行うと、私の静的ライブラリレベルでのリンクを維持する方法があります。

編集:

私はブーストLIBSを無視する.exeのリンカを伝える場合は.exeファイルがすべてでブーストを心配する必要はありません除いて、明示的にそれはすべてOKです。

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

答えて

24

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

あなたはブーストのすべてを含めることによって、大きなあなたの.libを不要にしたい場合は、この質問は(私は本当に自分自身を試したことがない)答えを保持するようだ:Linking static libraries to other static libraries

+1

この回答はOKソリューションにつながりました。私はBOOST_ALL_NO_LIBを定義し、手動でスタティックブーストライブラリをライブラリアンに追加しました。私の.exeプロジェクトでは、BOOSTについての知識は必要ありません。自動的なBOOSTリンクがDefaultLibsを伝えるように思われるのは残念です。 – T33C

+0

'Boost.Thread'の特別な注意事項' BOOST_THREAD_USE_LIB'オプションを使う必要があるかもしれません。 http://shoddykid.blogspot.in/2008/07/getting-started-with-boost.htmlを参照してください。 –

+1

私は同じ問題を抱えています...私はプリプロセッサBOOST_ALL_NO_LIBを使って解決しました。ブーストlibsのディレクトリを開き、リンカ - >入力 - >付随依存関係に唯一使用されているライブラリを追加します。 デフォルトでは、boostヘッダはヘッダにlibsの名前をマウントします。これはプリプロセッサBOOST_LIB_DIAGNOSTICを使って確認できます。 –

4

あなたのライブラリを構築する際に、あなたのブーストライブラリを含めることができます。これを行うには、Visual StudioのLibrarian > Generalプロパティページで、ブーストライブラリをAdditional Dependenciesと指定します。

しかし、クライアントが自分自身でブーストを使用し、静的にリンクしている(特に使用しているバージョンとは異なる)場合に問題が発生することがあります。

+0

はい、私はこのオプションを見ましたが、できませんそれを働かせる。リンカの出力を冗長にして、.libプロジェクトが.objファイルにリンクし、.exeがboostライブラリを検索して見つけて、それらにリンクしようとしていることがわかりました。 – T33C

+0

冗長なビルド出力を(ライブラリをビルドするときに)ポストできますか?ブーストライブラリはあなたのlibコマンドラインになければなりません。 http://msdn.microsoft.com/en-us/library/e17b885t(v=VS.100).aspxに記載されているように、 'LIBは指定されたファイルのすべてのオブジェクトを含むライブラリを1つ作成します。したがって、あなたの.exeがあなたのライブラリにリンクするとき、あなたはライブラリのパブリックヘッダファイルにboostを含まない限り、それはboostを必要とすべきではありません。 –

+1

+1 Danielさん、ありがとうございました。この問題はBOOSTがライブラリ内で自動的にリンクする方法と思われます。それらはデフォルトライブラリと見なされ、ランタイムとともに伝播します。 BOOST_ALL_NO_LIBを定義し、私の.libのブーストライブラリでリンクすると動作します。 – T33C

1

追加ライブラリを作成しましたか? Boostにはコンパイルが必要なライブラリがあります。場合は、それを行っていない場合は、 "Getting started in Windows" Boostライブラリを構築する方法についてを参照してください。

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

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

+0

ありがとう、もう一度私の質問をお読みください。私はブーストを構築し、OKにリンクすることができます。私は.exeプロジェクトに.libだけを増やすためにリンクする必要はありません。 – T33C

関連する問題