Boost版本与VS版本匹配的一些坑
在处理一个旧项目代码时遇到这样一个问题。
旧项目是一个连接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版。
以上是这次搬砖过程中遇到的坑及对坑的研究,留存笔记!