分享

Boost版本与VS版本匹配的一些坑

 _src_ 2021-08-15

在处理一个旧项目代码时遇到这样一个问题。

旧项目是一个连接MongoDB库的小程序,VS2008 + C++开发的,用了一个MongoDB驱动库,

该驱动库又引用了Boost库,当时用的Boost1.42版本。而现在VS版本至少都是2012以上了,Boost库也已更新到了1.69。

为了能用当前VS2012开发环境重新编译这个就项目,得先编译MongoDB驱动库。

于是先下载并用VS2012编译器编译了最新版Boost1.69静态库。(编译完后硬盘少了7个多个G空间!)

接下来再编译MongoDB驱动库时遇到了Boost文件系统库版本不匹配的问题,发现驱动库项目定义了版本号V2,

又去查阅Boost发布日志,发现,Boost在1.5之后Filesystem 版本都升级到了V3,所以可用的最高版本是Boost1.49

其实这个版本是v2v3都兼容的,于是下载并编译了1.49版本的静态库。

再次去编译MongoDB驱动时,又遇到一个“system_error找不到匹配重载函数”的问题,

没有太仔细去研究错误细节,直观感觉是1.42以后的版本似乎存在各种问题,没法跟那个MongoDB驱动库匹配。

于是只好又下载并用vs2012编译了1.42版本的静态库。

再编译MongoDB驱动库时,惊人地提示要vc100的库,编译过程中还提示了这样的信息

“Unknown compiler version - please run the configure tests and report the results”

这时有点崩溃的感觉,为了不耽误时间,只好又回到了VS2008的环境使用了1.42版本,终于编译成功.

编译成功之后,仔细想想,不甘心就这样回到原点,不甘心被各种问题嘲弄。

再回过头研究了上面遇到的问题

=》vs2012编译的boost1.42库为什么不能用到MongoDB驱动库中?

通过boost\config\compiler\visualc.hpp文件,找到了问题根源,在文件最后有这样的代码:

// last known and checked version is 1600 (VC10, aka 2010):
#if (_MSC_VER > 1600)
#  if defined(BOOST_ASSERT_CONFIG)
#     error "Unknown compiler version - please run the configure tests and report the results"
#  else
#     pragma message("Unknown compiler version - please run the configure tests and report the results")
#  endif
#endif

就是说Boost库都有对VS最高版本的一个匹配,1.48版本以下,最高可适用到VS2010

所以即便我用VS2012编译了Boost1.42库,在链接到MongoDB库时,限于Boost库的定义,只能去找VC100的库。

=》那么我用VS2012编译的Boos1.49版本的,为何还是不行呢

主要问题卡在编译MongoDB时,报的那个函数参数不匹配的问题。

boost::system::system_error::system_error:7个重载中没有一个可以转换所有参数类型

定位了错误代码行,发现在MongoDB驱动库中有这样的代码:

throw boost::system::system_error(

::GetLastError(),boost::system::system_category);

又查看了boost库中该函数的定义,发现是有匹配的函数,但为何又说不匹配呢,再仔细看

发现在boost::system::system_category不是一个变量,而是一个函数,这也是Boost版本升级过程中的变动。

于是将改行代码修改为

throw boost::system::system_error(

::GetLastError(),boost::system::system_category());

再编译,通过!就是说,那个驱动库用vs2012是可以编译成功的,但必须用Boost1.49版。

以上是这次搬砖过程中遇到的坑及对坑的研究,留存笔记!

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多