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++
.
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.
(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:
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.