Ошибка boost :: date_time при сборке MongoDB: winapi не является членом - PullRequest
0 голосов
/ 11 ноября 2018

При сборке MongoDB с SCons и boost я получаю ошибки. Вот моя командная строка:

C: \ mongo-cxx-driver> Scons --prefix = $ HOME / mongo-client-lib --cpppath = C: \ boost_1_66_0 --libpath = C: \ boost_1_66_0 \ stage64 \ lib --dbg = on --64 установить

Вот сообщения об ошибках, которые я получаю:

src\mongo\util\time_support.cpp(904): error C2039: 'winapi': is not a member of 'boost::date_time'
C:\boost_1_66_0\boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
src\mongo\util\time_support.cpp(904): error C3083: 'winapi': the symbol to the left of a '::' must be a type
src\mongo\util\time_support.cpp(904): error C2039: 'file_time_to_microseconds': is not a member of 'boost::date_time'
C:\boost_1_66_0\boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
src\mongo\util\time_support.cpp(904): error C3861: 'file_time_to_microseconds': identifier not found
src\mongo\util\time_support.cpp(936): error C2039: 'winapi': is not a member of 'boost::date_time'
C:\boost_1_66_0\boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
src\mongo\util\time_support.cpp(936): error C3083: 'winapi': the symbol to the left of a '::' must be a type
src\mongo\util\time_support.cpp(936): error C2039: 'file_time_to_microseconds': is not a member of 'boost::date_time'
C:\boost_1_66_0\boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
src\mongo\util\time_support.cpp(936): error C3861: 'file_time_to_microseconds': identifier not found
scons: *** [build\win32\64\dbg_on\mongo\util\time_support.obj] Error 2
scons: building terminated because of errors.

Ответы [ 2 ]

0 голосов
/ 13 августа 2019

Если вы в отчаянии, и вы все еще используете устаревший драйвер MongoDB с истекшим сроком эксплуатации (чего не следует делать!) И не можете обновить весь свой код в это время (что вам, в конечном итоге, придется!), И вам нужно быстрое исправление, затем вы можете вставить следующий код (взятый из Boost 1.53.0 ) в time_support.cpp:

namespace boost {
  namespace date_time {
    namespace winapi {
    /*!
     * The function converts file_time into number of microseconds elapsed since 1970-Jan-01
     *
     * \note Only dates after 1970-Jan-01 are supported. Dates before will be wrapped.
     *
     * \note The function is templated on the FILETIME type, so that
     *       it can be used with both native FILETIME and the ad-hoc
     *       boost::date_time::winapi::file_time type.
     */
    template< typename FileTimeT >
    inline boost::uint64_t file_time_to_microseconds(FileTimeT const& ft)
    {
        /* shift is difference between 1970-Jan-01 & 1601-Jan-01
        * in 100-nanosecond intervals */
        const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008

        union {
            FileTimeT as_file_time;
            uint64_t as_integer; // 100-nanos since 1601-Jan-01
        } caster;
        caster.as_file_time = ft;

        caster.as_integer -= shift; // filetime is now 100-nanos since 1970-Jan-01
        return (caster.as_integer / 10); // truncate to microseconds
    }
    }
  }
}

Это определит отсутствующую функцию.

0 голосов
/ 11 ноября 2018

TL; DR - Вы не можете ожидать, чтобы выбрать произвольную или текущую версию библиотеки и собрать MongoDB с ней; они делают снимки своих зависимостей в своем репозитории, и нет никаких обещаний о сборке с версиями, кроме этих.


MongoDB имеет снимки своих зависимостей в каталоге src / thirdparty . Версия Boost Snapshot - 1.60, выпущенная в 2015 году . Вы можете видеть, что в этой версии boost есть пространство имен winapi, определенное в boost/date_time/filetime_functions.hpp.

Однако вы пытаетесь построить против повышения 1.66, которое было выпущено в декабре 2017 года 1017 *. В заметках о выпуске упоминаются изменения в date_time:

DateTime:

  • Библиотека была преобразована для использования Boost.WinAPI в качестве уровня абстракции для Windows SDK.

  • Исправлено интегральное переполнение, которое могло привести к неверным результатам при сложении или вычитании многих лет из даты (см. Здесь).

Эта версия filetime_functions не имеет этого пространства имен внутри date_time, а также текущего снимка 1.67 файла filetime_functions.hpp .

Глядя на журнал git blame для src / mongo / util / time_support.cpp , похоже, что рассматриваемый код монго с упоминанием date_time::winapi был добавлен 3 года назад (до этого рефакторинга winapi) и с тех пор не изменилось.

...