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

Что означает Boost под "библиотеками только для заголовков" и "автоматическим связыванием"?

На странице документации библиотеки Boost есть две категории: " Библиотеки только для заголовков " и " Автоматическое связывание ".

Я предполагаю, что "Библиотеки только для заголовков" означают, что вам не нужно связываться с библиотеками Boost, чтобы использовать их, а "Автоматическое связывание" означает, что вы должны ссылаться.

Но когда я использую Boost.Timer, мне нужно связать статическую или динамическую библиотеку с именем timer (libboost_timer.a и libboost_timer.so.1.48.0 и различные программные ссылки на них в пути к библиотеке Linux), которая, по-видимому, является точным файлом библиотеки. Boost.Timer. Мне даже нужно соединиться с Boost.System и Boost.Chrono, хотя понятно, что сама библиотека использует некоторые другие библиотеки, которые необходимо связать.

С другой стороны, Boost четко заявил, что Boost.Asio принадлежит "Автоматическому связыванию", но нет никаких библиотечных файлов с именем, подобным asio.

Так что же на самом деле означает " библиотека только для заголовков " или " автоматическое связывание "? Или это чисто ошибка?

4b9b3361

Ответ 1

Как вы сказали, "библиотека только заголовков" означает, что вся библиотека находится в заголовочных файлах, поэтому для ее использования достаточно одной (или нескольких) строк #include. Связывание не требуется.

"Автоматическое связывание" означает, что, хотя библиотека нуждается в некотором связывании (напрямую или в виде зависимости), вам не нужно указывать это в строке компилятора, потому что файлы #include 'd сделают некоторую магию, чтобы внести соответствующие библиотеки автоматически, если поддерживается компилятором.

Например, в компиляторах MSVC они используют #pragman comment(lib, "..."); в компиляторах Borland они используют #pragma defineoptions; и т.д.

И что особенно важно, "автоматическое связывание" не поддерживается компилятором GNU.

Иногда автоматическое связывание может быть проблематичным (например, смешивание версий отладки и выпуска), и вы можете выборочно отключить их, задав некоторые макросы препроцессора: BOOST_<libname>_NO_LIB. В этом случае вам придется делать связывание вручную.

ОБНОВЛЕНИЕ: о вашем комментарии ниже:

Boost.Timer утверждает, что он является "библиотекой только для заголовков", но у него есть файлы lib в каталоге lib.

Похоже, что есть ошибка в документации Boost. На самом деле есть две разные библиотеки с именем timer: старая, устаревшая, только для заголовка <boost/timer.hpp> и новая, улучшенная, более прохладная, автоматически связываемая <boost/timer/timer.hpp>.

Но по какой-то причине на главной странице документации перечислены свойства старой.

Там нет Boost.Asio lib файлов.

На главной странице документации библиотеки документации Boost вы можете видеть, что Asio указан как Автоматическое связывание из-за зависимости. Конкретные зависимости перечислены в другом месте: Boost.System и Boost.Regex, и обе представляют автоматическое связывание.

Ответ 2

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

Тем не менее, вполне возможно написать библиотеку только для заголовков, которая зависит от какой-либо другой библиотеки, которая может быть не только для заголовка. В этом случае, даже если вам не нужно рассказывать компоновщику о первой библиотеке, которую вы используете, вам все равно придется рассказать о ней. Особенно, когда/если весь код может быть набит одним из того, что компоновщик считает библиотекой (например, одним .lib или .a файлом), это может закончиться главным образом различием без разницы (просто чтобы быть ясным: это здесь не обязательно, но он может и вообще возникает).