Подтвердить что ты не робот

Как включить библиотеку boost в программу на С++?

Я пытаюсь скомпилировать эту небольшую программу:

#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). Я нахожу следующий файл: /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++.

4b9b3361

Ответ 1

Вам нужен путь включения в команду g++:

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

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

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

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

Вероятно, вы найдете этот вопрос.

Ответ 2

(Это не прямой ответ на вопрос, но список соображений, которые, как мне кажется, должны быть рассмотрены с окончательным и полным ответом, который @uoɥʇʎPʎzɐɹ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 упрощает многие из соображений, но, конечно, иногда вам нужны и другие части.

Что нужно учитывать:

  • Используете ли вы только части только для заголовка Boost или вам нужно отдельно скомпилированную часть тоже? Если вам нужна отдельная компиляция part, вы используете статический lib или динамический lib? Если вы используете отдельно скомпилированную часть и хотите использовать динамическую библиотеку lib, вы должны решить, как найти динамическую библиотеку при запуске приложения (особенно если вы распространяете свой проект как двоичный файл).
  • Разве ваш проект распространяется как источник или как двоичный? В двоичном случае, вы беспокоитесь в основном о рабочем процессе разработчика (но см. пункт выше об использовании динамического lib). В исходном случае вы хотите его легко скомпилировать на каждом другом компьютере.
  • Вы хотите, чтобы ваш проект придерживался той же версии Boost (at до тех пор, пока вы явно не решите изменить версию), или вы хотите его использовать все, что установлено на конкретной машине (при условии, что там это не изменения API)?
  • Вы в порядке с копией Boost (или ее части) с проект или вы хотите, чтобы центральное место для всех ваших проектов использовалось?
  • Сколько шагов ручной настройки вы хотите наложить на пользователей (конец пользователи или разработчики, зависит от других вопросов выше)? (0 вероятно, предпочтен, но всегда есть компромисс.)
  • Является ли ваш проект только для Windows, только для Linux и т.д.? Каждая платформа имеет его собственными способами и в зависимости от вашего ответа на другие вопросы, методы, которые вы должны использовать, могут различаться между ОС. Кросс-платформенный, для нашей темы, обычно означает, что вы должны внедрить соответствующие подходы для каждой из платформ, которые вы хотите для поддержки.
  • Каков ваш набор инструментов и среда сборки (например, Visual Studio, Qt, make, простые скрипты и т.д.)?

Ответ 3

Чтобы указать каталог для поиска включенных файлов:

-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. Возможно, у вас есть возможность включить патч, уже экспортированный в некоторую переменную среды.