在处理一个旧项目代码时遇到这样一个问题。 旧项目是一个连接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): 所以即便我用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版。 以上是这次搬砖过程中遇到的坑及对坑的研究,留存笔记!
|
|