Зачем мне нужно компилировать DateTime в boost, если я не использую to_string или from_string?

При компиляции проекта Visual Studio 2005, который ссылается на сочетание управляемого и неуправляемого кода на C++, я получаю следующую ошибку:

1> LINK: фатальная ошибка LNK1104: не удается открыть файл 'libboost_date_time-vc80-mt-1_42.lib'

Я следовал Руководству по началу работы. Актуален этот фрагмент:

"Boost.DateTime имеет двоичный компонент, который необходим только в том случае, если вы используете его to_string / from_string или функции сериализации, или если вы нацелены на Visual C++ 6.x или Borland".

Я сделал глобальный поиск для "to_string" и "from_string". В коде этих методов DateTime нет вхождений.

В документации самой библиотеки DateTime есть этот фрагмент:

"Библиотека имеет несколько функций, которые требуют создания библиотечного файла (в основном функции to_string, from_string). Большинство пользователей библиотеки могут эффективно использовать библиотеку БЕЗ сборки библиотеки, но просто включая необходимые заголовки. Если библиотека необходима Jamfile в каталоге компоновки создаст "статическую" библиотеку (libboost_date_time) и "динамическую / общую" библиотеку (boost_date_time), которая содержит эти функции ".

Как бы я решил проблему? Простым решением является сборка библиотеки или использование бинарного установщика Windows из BoostPro, однако меня беспокоит необходимость скомпилированной библиотеки, когда, согласно документации, я не в ситуации, которая требует этого.

Другой вопрос заключается в том, что документация DateTime, по-видимому, указывает на то, что это "главным образом to_string, from_string)". Может ли мой код ссылаться на какую-то другую функцию, которая потребует создания файла библиотеки? Кто-нибудь знает, какие еще функции включены? Существуют ли функции, которые сами оборачиваются или вызывают to_string или from_string?

Единственное включение, которое я использую:

#include <boost/date_time/gregorian/gregorian.hpp>

5 ответов

Решение

Проект компилируется и связывается чисто после следующего устранения неполадок:

Я определил BOOST_LIB_DIAGNOSTIC - чтобы посмотреть, какой диагностический вывод я могу получить из автоматического компоновщика. Не слишком информативно:

1> Ссылка на файл lib: libboost_date_time-vc80-mt-1_42.lib
1> LINK: фатальная ошибка LNK1104: не удается открыть файл 'libboost_date_time-vc80-mt-1_42.lib'

Затем я определил BOOST_ALL_NO_LIB = 1 - отключает все автоматические ссылки. Проект теперь компилируется и ссылки чисто.

Повышающие заголовки используют прагму, чтобы сигнализировать компиляторам, когда искать файл lib. В то время как библиотека date_time не делает этого, другие заголовки в boost это зависит от do.

Просто добавь:

#define BOOST_DATE_TIME_NO_LIB

перед включением заголовков повышения в ваш код, например:

#define BOOST_DATE_TIME_NO_LIB

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>

....
....

Я надеюсь, что это поможет, в моем случае это работает.

В моем случае эта ошибка возникает только на компоновщике msvc. при компиляции clang или gcc проблем вообще нет. Добавляя

#define BOOST_DATE_TIME_NO_LIB

или же

#define BOOST_ALL_NO_LIB

в заголовочный файл ошибка исчезла.

boost поставляется с инструментом bcp, который можно использовать для извлечения именно того подмножества, которое вам нужно. Посмотрите, звучит так, как будто вы найдете это полезным.

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

Другие вопросы по тегам