web-dev-qa-db-ja.com

ブーストライブラリをC ++プログラムに含める方法は?

私はこの小さなプログラムをコンパイルしようとしています:

#include <boost/math/distributions/poisson.hpp>

namespace boost { namespace math {

template <class RealType = double, 
          class Policy   = policies::policy<> >
class poisson_distribution;

typedef poisson_distribution<> poisson;

template <class RealType, class Policy>
class poisson_distribution
{ 
public:
  typedef RealType value_type;
  typedef Policy   policy_type;

  poisson_distribution(RealType mean = 1); // Constructor.
  RealType mean()const; // Accessor.
}

}} // namespaces boost::math

このコードは here から取得されます。

コンパイラーから、boost/math/distributions/poisson.hppが見つからないと通知されました。そこで、私は自分でこのファイルを見つけようとします(locate poisson.hppコマンドを使用)。次のファイルが見つかりました:/opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp。したがって、私のコードでは、コンパイラーが確実にファイルを見つけられるように、ファイルの完全な名前を入れています。

#include </opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp>

しかし、もう1つのエラーメッセージが表示されます。boost/math/distributions/fwd.hppが見つかりません。

コンパイラに正しいディレクトリ内のファイルを検索させる方法はありますか?

g++コンパイラを使用しています。

14
Roman

G ++コマンドにインクルードパスが必要です。

g++ -I/opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/  [rest of command here]

(およびおそらくライブラリパスへのリンク)。

一般に、ソースコードにフルパスを配置するのはではないのが得策です。その種の移植性の概念は完全に破壊されます:)(つまり、そのコードは自分のPC以外のPCでコンパイルできなくなり、さらにそれ半年後に疑わしいことになるでしょう)。

とにかく、上記のような長いコンパイラ行を入力していることに気付いた場合は、実際に makefile を使用するときです。

あなたはおそらく この質問 も興味深いと思うでしょう。

18
Rody Oldenhuis

(これは質問への直接の回答ではありませんが、@uoɥʇʎPʎzɐɹCがここで見たい最終的な完全な回答で対処する必要があると考える考慮事項のリストです。)

C++でサードパーティの依存関係を処理するという問題は単純なものではありません。これには多くのアプローチがあり、適切なアプローチの選択は、ツールセットと環境、プロジェクト管理、および取るべきトレードオフに依存します。

Boostの場合、それは主にヘッダーのみのライブラリであることを覚えておく必要がありますが、一部のコンポーネントには個別にコンパイルされた部分も含まれます(静的または動的libにすることができ、コンポーネントまたは特定のユースケースのみに必須にすることができます) 。例えば。 Boost.Filesystemはコンパイルが必要で、Boost.GraphはGraphVizファイルを解析する場合にのみ必要で、Boost.Variantはそれをまったく必要としません(「ヘッダーのみ」のライブラリです)。詳細については、 http://www.boost.org/doc/libs/release/more/getting_started/unix-variants.html#header-only-libraries を参照してください(これにより、最新バージョンにリダイレクトされます。現在は1.61です)。

Boostのヘッダーのみの部分のみを使用すると、考慮事項の多くが簡略化されますが、もちろん他の部分も必要になる場合があります。

考慮すべき事柄:

  1. Boostのヘッダーのみの部分のみを使用していますか、それとも個別にコンパイルした部分も必要ですか?個別にコンパイルされたパーツが必要な場合、静的libまたは動的libを使用しますか?個別にコンパイルされたパーツを使用し、動的libを使用する場合は、アプリケーションの実行時に動的libを見つける方法を決定する必要があります(特に、プロジェクトをバイナリとして配布する場合)。
  2. プロジェクトはソースまたはバイナリとして配布されていますか?バイナリの場合、主に開発者のワークフローを心配します(ただし、動的libの使用に関する上記のポイントを参照してください)。ソースの場合は、他のすべてのコンピューターで簡単にコンパイルできるようにする必要があります。
  3. プロジェクトに同じバージョンのBoostを使用したままにしますか(少なくとも明示的にバージョンを変更することを決定するまで)、特定のマシンにインストールされているものをすべて使用しますか(APIの変更がない場合)。
  4. プロジェクトにBoost(またはその一部)のコピーを用意しても大丈夫ですか、それともすべてのプロジェクトで中央の場所を使用しますか?
  5. ユーザーに強制したい手動の構成手順(エンドユーザーまたは開発者、上記の他の質問によって異なります)はどれくらいですか? (おそらく0が望ましいですが、常にトレードオフがあります。)
  6. プロジェクトはWindowsのみ、Linuxのみなどですか?各プラットフォームには独自の方法があり、他の質問への回答に応じて、使用する方法はOSによって異なります。私たちのトピックのクロスプラットフォームとは、通常、サポートするプラットフォームごとに関連するアプローチを実装する必要があることを意味します。
  7. ツールセットとビルド環境は何ですか(例:Visual Studio、Qt、make、単純なスクリプトなど)?
6
Yehezkel B.

インクルードファイルを検索するディレクトリを指定するには:

-I /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include

ライブラリを検索するディレクトリを指定するには:

-L /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/lib

実際のライブラリ名を指定するには:

-l foo

ライブラリがlib foo。aと呼ばれるとき

-I-L、または-lの後にスペースを書く必要はありません。今のところ、読みやすくなっています。

ヒント:

Makefileを使用します。多分あなたはブーストインクルードパッチをすでにいくつかの環境変数にエクスポートしています。

1
Szabolcs Dombi