构建MongoDB时出现boost::date_time错误:winapi不是成员



在使用SCons和boost构建MongoDB时,我遇到了错误。这是我的命令行:

C:\mongo cxx driver>Scons--prefix=$HOME/mongo client lib--cppath=C:\boost_1_66_0--libpath=C:\boost_1_66_0\sstage64\lib--dbg=on--64安装

以下是我收到的错误消息:

srcmongoutiltime_support.cpp(904): error C2039: 'winapi': is not a member of 'boost::date_time'
C:boost_1_66_0boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
srcmongoutiltime_support.cpp(904): error C3083: 'winapi': the symbol to the left of a '::' must be a type
srcmongoutiltime_support.cpp(904): error C2039: 'file_time_to_microseconds': is not a member of 'boost::date_time'
C:boost_1_66_0boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
srcmongoutiltime_support.cpp(904): error C3861: 'file_time_to_microseconds': identifier not found
srcmongoutiltime_support.cpp(936): error C2039: 'winapi': is not a member of 'boost::date_time'
C:boost_1_66_0boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
srcmongoutiltime_support.cpp(936): error C3083: 'winapi': the symbol to the left of a '::' must be a type
srcmongoutiltime_support.cpp(936): error C2039: 'file_time_to_microseconds': is not a member of 'boost::date_time'
C:boost_1_66_0boost/date_time/filetime_functions.hpp(28): note: see declaration of 'boost::date_time'
srcmongoutiltime_support.cpp(936): error C3861: 'file_time_to_microseconds': identifier not found
scons: *** [buildwin3264dbg_onmongoutiltime_support.obj] Error 2
scons: building terminated because of errors.

TL;DR-您不能期望选择任意或当前版本的库并使用它构建MongoDB;他们在回购中快照了他们的依赖关系,除了这些版本之外,没有任何关于构建版本的承诺。


MongoDB在src/thirdparty目录中有其依赖关系的快照。boost快照的版本是1.60,发布于2015年。您可以看到,在该版本的boost中,在boost/date_time/filetime_functions.hpp中定义了一个winapi命名空间。

然而,您正试图在2017年12月发布的boost 1.66的基础上进行构建。发行说明提到了对date_time:的更改

日期时间:

  • 该库已转换为使用Boost.WinAPI作为Windows SDK的抽象层。

  • 修正了一个整数溢出问题,该问题可能会导致在一个日期上加或减很多年时产生错误的结果(请参阅此处(。

该版本的filetime_functions在date_time内没有此命名空间,filetime_ffunctions.hpp.的当前1.67快照也没有

查看src/mongo/util/time_support.cpp的git指责日志,提到date_time::winapi的mongo代码似乎是3年前添加的(在这次winapi重构之前(,此后一直没有更改。

如果你很绝望,并且你仍然在使用报废的遗留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
}
}
}
}

这将定义缺失的函数。

相关内容

  • 没有找到相关文章

最新更新