web-dev-qa-db-fra.com

Comment inclure la bibliothèque boost dans un programme C++?

J'essaie de compiler ce petit programme:

#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

Ce code est pris de ici .

Le compilateur me dit que boost/math/distributions/poisson.hpp est introuvable. Donc, j'essaie de trouver ce fichier moi-même (en utilisant la commande locate poisson.hpp). Je trouve le fichier suivant: /opt/software/boost/1.45_ubuntu12.4lts_gcc4.5.3/include/boost/math/distributions/poisson.hpp. Donc, dans mon code je mets le nom complet du fichier pour être sûr que le compilateur le trouve:

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

Mais maintenant je reçois un autre message d'erreur: boost/math/distributions/fwd.hpp n'est pas trouvé.

Existe-t-il un moyen de forcer le compilateur à rechercher les fichiers dans le bon répertoire?

J'utilise le compilateur g++.

13
Roman

Vous avez besoin d’un chemin d’inclusion dans votre commande g ++: 

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

(et éventuellement un lien vers un chemin de bibliothèque).

En général, c'est pas une bonne idée de mettre des chemins complets dans votre code source; cela détruit complètement l'idée de la portabilité :) (en d'autres termes, le code ne peut plus être compilé sur aucun autre PC au monde que le vôtre, et même que sera douteux d'ici six mois) .

Quoi qu'il en soit, si vous vous trouvez en train de taper de longues lignes de compilateur comme celle ci-dessus, il est vraiment temps de commencer à utiliser un makefile

Vous trouverez probablement cette question intéressante également.

19
Rody Oldenhuis

(Ce n'est pas une réponse directe à la question, mais une liste de considérations qui, selon moi, devraient être abordées avec la réponse finale complète que @ uoɥʇʎPʎzɐɹC veut voir ici.)

La question de la gestion des dépendances de tiers avec C++ n’est pas simple. Il existe de nombreuses approches pour cela. Le choix de l'approche qui vous convient dépend de votre ensemble d'outils et de votre environnement, de votre gestion de projet et des compromis que vous souhaitez prendre.

Pour Boost, nous devons garder à l'esprit qu'il s'agit principalement d'une bibliothèque avec en-tête uniquement, mais que certains composants incluent également une partie compilée séparément (peut être une bibliothèque statique ou dynamique, peut être obligatoire pour le composant ou simplement pour un cas d'utilisation spécifique). .Par exemple Boost.Filesystem nécessite une compilation, Boost.Graph ne le requiert que si vous souhaitez analyser les fichiers GraphViz et Boost.Variant n'en a pas du tout besoin (c'est la bibliothèque "header-only") . Pour plus de détails, voir http : //www.boost.org/doc/libs/release/more/getting_started/unix-variants.html#header-only-libraries (ceci redirige vers la dernière version, actuellement la 1.61).

Utiliser uniquement des parties de Boost réservées aux en-têtes simplifie un grand nombre de considérations, mais bien entendu, vous avez parfois aussi besoin des autres parties.

Choses à considérer:

  1. Utilisez-vous uniquement des parties de Boost contenant uniquement des en-têtes ou avez-vous également besoin d'une partie compilée séparément? Si vous avez besoin d'une partie Compilée séparément, utilisez-vous une bibliothèque statique ou une bibliothèque dynamique? Si vous utilisez une partie compilée séparément et que vous souhaitez utiliser une bibliothèque dynamique, vous devez choisir comment trouver la bibliothèque dynamique lors de l'exécution de l'application (Surtout si vous distribuez votre projet sous forme binaire).
  2. Votre projet est-il distribué en tant que source ou binaire? Dans la binairecase, vous vous inquiétez principalement du flux de travail du développeur (mais reportez-vous au point .__ ci-dessus concernant l’utilisation de la bibliothèque dynamique). Dans le cas source, vous voulez.il doit être facile à compiler sur tout autre ordinateur.
  3. Souhaitez-vous que votre projet conserve la même version de Boost (à Au moins jusqu'à ce que vous décidiez explicitement de changer de version) ou que vous le vouliez utiliser tout ce qui est installé sur la machine spécifique (en supposant que c'est làis. pas de changements d'API)?
  4. Souhaitez-vous avoir une copie de Boost (ou une partie de celle-ci) avec le projet Ou souhaitez-vous un emplacement central pour tous vos projets?
  5. Combien d’étapes de configuration manuelles que vous souhaitez imposer aux utilisateurs (utilisateurs finaux ou développeurs, dépend des autres questions ci-dessus)? (0 est probablement préféré, mais il y a toujours un compromis à faire.)
  6. Votre projet concerne-t-il uniquement Windows, Linux uniquement, etc.? Chaque plate-forme a Ses propres manières et, en fonction de votre réponse à d'autres questions, les méthodes Que vous devez utiliser peuvent varier d'un système d'exploitation à l'autre Multiplate-forme, pour notre sujet, signifie généralement que vous devez .implémentez les approches pertinentes pour chacune des plates-formes que vous souhaitez.
  7. Quels sont votre jeu d’outils et votre environnement de construction (Visual Studio, Qt, Make, scripts simples, etc.)?
6
Yehezkel B.

Pour spécifier un répertoire dans lequel rechercher les fichiers d'inclusion:

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

Pour spécifier un répertoire dans lequel rechercher des bibliothèques:

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

Pour spécifier le nom actuel de la bibliothèque:

-l foo

quand votre bibliothèque s'appelle lib foo . a

vous n'avez pas besoin d'écrire d'espace après -I, -L ou -l, pour le moment, il est plus lisible.

CONSEIL:

Utilisez Makefile. Peut-être avez-vous le correctif d'inclusion déjà exporté vers une variable d'environnement.

1
Szabolcs Dombi