it-swarm.com.de

Wie binden Sie die Boost-Bibliothek in ein C++ - Programm ein?

Ich versuche dieses kleine Programm zu kompilieren:

#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

Dieser Code stammt von hier .

Der Compiler sagt mir, dass boost/math/distributions/poisson.hpp nicht gefunden wird. Ich versuche also, diese Datei selbst zu finden (mit dem Befehl locate poisson.hpp). Ich finde die folgende Datei: /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp. Also füge ich in meinem Code den vollständigen Namen der Datei ein, um sicherzustellen, dass der Compiler sie findet:

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

Nun aber bekomme ich eine weitere Fehlermeldung: boost/math/distributions/fwd.hpp wird nicht gefunden.

Gibt es eine Möglichkeit, den Compiler zu zwingen, die Dateien im richtigen Verzeichnis zu durchsuchen?

Ich benutze g++ Compiler.

13
Roman

Sie benötigen einen Include-Pfad in Ihrem g ++ - Befehl: 

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

(und möglicherweise auch einen Link zu einem Bibliothekspfad).

Im Allgemeinen ist es nicht eine gute Idee, vollständige Pfade in den Quellcode einzufügen. diese Art zerstört völlig die Idee der Portabilität :) (was bedeutet, dass Code auf keinem anderen PC der Welt als Ihrem eigenen PC kompiliert werden kann, und sogar , dass in einem halben Jahr fragwürdig sein wird) .

Wenn Sie jedoch lange Compilerzeilen wie die oben stehende tippen, ist es wirklich an der Zeit, ein makefile zu verwenden. 

Sie werden wahrscheinlich diese Frage auch interessant finden.

19
Rody Oldenhuis

(Dies ist keine direkte Antwort auf die Frage, sondern eine Liste von Überlegungen, die meiner Meinung nach mit der endgültigen und vollständigen Antwort angesprochen werden sollten, die @ uoɥʇʎPʎzɐɹC hier sehen möchte.)

Die Frage der Handhabung von Abhängigkeiten von Drittanbietern mit C++ ist nicht einfach. Hierfür gibt es viele Ansätze. Die Auswahl des für Sie richtigen Ansatzes hängt von Ihrem Toolset und der Umgebung, Ihrem Projektmanagement und den von Ihnen gewünschten Kompromissen ab.

Für Boost müssen wir bedenken, dass es sich hauptsächlich um eine Kopfbibliothek handelt. Einige Komponenten enthalten jedoch auch einen separat kompilierten Teil (kann statisch oder dynamisch sein, kann für die Komponente obligatorisch sein oder nur für einen bestimmten Anwendungsfall). .Z.B Boost.Filesystem erfordert eine Kompilierung, Boost.Graph erfordert dies nur, wenn Sie GraphViz-Dateien analysieren möchten und Boost.Variant es überhaupt nicht benötigt (ist eine "Nur-Kopf" -Bibliothek) . Einzelheiten finden Sie unter http : //www.boost.org/doc/libs/release/more/getting_started/unix-variants.html#header-only-libraries (leitet zur neuesten Version über, derzeit 1.61).

Die Verwendung von nur Kopfbereichen nur von Boost vereinfacht viele Überlegungen, aber manchmal benötigen Sie auch die anderen Teile.

Dinge, die man beachten muss:

  1. Verwenden Sie nur Header-Bereiche von Boost oder benötigen Sie einen separat kompilierten Wenn Sie einen separat kompilierten -Teil benötigen, verwenden Sie die statische oder dynamische Bibliothek? Wenn Sie den separat kompilierten Teil Verwenden und die dynamische Bibliothek verwenden möchten, müssen Sie entscheiden, wie Sie die dynamische Bibliothek finden, wenn Sie die Anwendung Ausführen (insbesondere wenn Sie Ihr Projekt als Binärdatei verteilen).
  2. Wird Ihr Projekt als Quelle oder als Binärdatei verteilt? Im binarycase machen Sie sich hauptsächlich Gedanken über den Entwickler-Workflow (siehe den Punkt __. Oben zur Verwendung der dynamischen Bibliothek). Im Quellfall möchten Sie, dass __. auf jedem anderen Computer leicht zu kompilieren ist.
  3. Möchten Sie, dass Ihr Projekt bei der gleichen Version von Boost bleibt (bei Mindestens, bis Sie sich ausdrücklich dazu entscheiden, die Version zu ändern) oder Sie möchten, dass __ alles verwendet wird, was auf dem jeweiligen Computer installiert ist (vorausgesetzt, dass dort __..) keine API-Änderungen)?
  4. Ist es in Ordnung, eine Kopie von Boost (oder einen Teil davon) mit dem Projekt Zu haben, oder möchten Sie einen zentralen Speicherort für alle Ihre Projekte?
  5. Wie viele manuelle Konfigurationsschritte müssen Sie für die Benutzer erzwingen (Ende Benutzer oder Entwickler, hängt von den anderen Fragen oben ab)? (0 ist Wahrscheinlich bevorzugt, aber es gibt immer einen Kompromiss.)
  6. Ist Ihr Projekt nur Windows, nur Linux usw.? Jede Plattform hat ihre eigenen Wege. Abhängig von Ihrer Antwort auf andere Fragen können die zu verwendenden .__-Methoden je nach Betriebssystem unterschiedlich sein Plattformübergreifend bedeutet in unserem Thema normalerweise, dass Sie .implementieren Sie die relevanten Ansätze für jede der von Ihnen gewünschten Plattformen.
  7. Was ist Ihre Toolset- und Build-Umgebung (z. B. Visual Studio, Qt, Make, einfache Skripts usw.)?
6
Yehezkel B.

So legen Sie ein Verzeichnis für die Suche nach Include-Dateien fest:

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

So legen Sie ein Verzeichnis für die Suche nach Bibliotheken fest:

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

So geben Sie den tatsächlichen Bibliotheksnamen an:

-l foo

wenn Ihre Bibliothek lib foo heißt. a

sie müssen nach -I, -L oder -l kein Leerzeichen schreiben.

HINWEIS:

Verwenden Sie Makefile. Möglicherweise haben Sie den Boost-Include-Patch bereits in eine Umgebungsvariable exportiert.

1
Szabolcs Dombi