Как включить библиотеку boost в программу на 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

этот код взят из здесь.

компилятор говорит мне, что boost/math/distributions/poisson.hpp не нашел. Итак, я пытаюсь найти этот файл самостоятельно (используя locate poisson.hpp command). Я нахожу следующий файл:/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>

но теперь я получаю другое сообщение об ошибке: boost/math/distributions/fwd.hpp не нашел.

есть способ заставить компилятор искать файлы в нужный каталог?

Я использую g++ компилятора.

3 ответов


вам нужен путь include в вашей команде g++:

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

(и, возможно, ссылка на путь к библиотеке).

В общем, это не хорошая идея поместить полные пути в исходный код; это полностью разрушает идею переносимости :) (это означает, что код больше не может быть скомпилирован на любом другом ПК в мире, чем ваш собственный, и даже это будет сомнительно через полгода).

в любом случае, если вы найдите себя, набрав длинные строки компилятора, как показано выше, пришло время начать использовать make-файл.

вы, вероятно, найти этот вопрос интересно, как хорошо.


(Это не прямой ответ на вопрос, но и список рекомендаций, которые я считаю должны решаться с окончательного и полного ответа, что @uoɥʇʎPʎzɐɹC хочет видеть здесь.)

вопрос обработки сторонних зависимостей с помощью C++ не является простым. Для этого существует множество подходов, и выбор правильного для вас подхода зависит от вашего набора инструментов и среды, от вашего управления проектами и от компромиссов, которые вы хотите принять.

для Boost, мы должны помнить, что это в основном библиотека только для заголовков, но некоторые компоненты также включают отдельно скомпилированную часть (может быть статическим или динамическим lib, может быть обязательным для компонента или просто для конкретного случая его использования). Е. Г. Импульс.Файловая система требует компиляции, Boost.Graph требует этого, только если вы хотите проанализировать файлы GraphViz и повысить.Варианту это вообще не нужно (это библиотека" только для заголовка"). Подробнее см. 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 is вероятно, предпочтительнее, но всегда есть компромисс.)
  6. ваш проект только для Windows, Linux и т. д.? Каждая платформа имеет свои собственные пути и в зависимости от вашего ответа на другие вопросы, методы, которые вы должны использовать, могут отличаться между ОС. Кросс-платформенный, для нашей темы, обычно означает, что вы должны реализуйте соответствующие подходы для каждой из платформ, которые вы хотите поддерживать.
  7. что является ли ваш набор инструментов и среда сборки (например, Visual Studio, Qt, сделать простые скрипты и т. д.)?

чтобы указать каталог для поиска файлов include:

-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фу

вам не нужно писать пробел после -I, -L или -l пока это более читабельно.

подсказка:

Используйте Makefile. Может быть, вы имейте патч boost include, уже экспортированный в некоторую переменную среды.