项目中BOOST版本升级遇到的问题
本周升级BOOST版本库。
现在由于要用到BOOST中的ASIO库,BOOST ASIO 从1.45 到1.53修改了不少BUG,所以要升级到BOOST 1.53
新版本的BOOST 1.53编译 按照官方文档来,很容易完成。
将工程中的旧版BOOST替换掉,更改了一些编译问题。主要是因为新版的一些头文件引用更改还有部分函数接口的改变导致。
修改完毕这些问题,在WINDOWS下一切正常。
但是在LINUX服务器上遇到两个问题。
1.luabind的头文件中,类似于下面这样的一段代码编译不通过
#if //code #elif //code #endif
用boost 1.45版本的时候,就没有问题
百思不得其解,GOOGLE到了一个解决方法,链接如下:
https://svn.boost.org/trac/boost/ticket/6631
大体是讲上面的代码修改为即可
#if //code #else #if //code #endif #endif
2.修改完上面的问题后,LINUX可以正常编译,但是启动程序的时候总是出现segment fault
从代码上,一个deque中size明显超常。gdb中的栈都是??,栈都被破坏了,无法用gdb调试。
但是用到deque的地方还比较多,如果人肉暴力审代码是下下策。
这个错误该如何解决呢?GOOGLE到了这个valgrind工具。
简单编译安装valgrind后,借助它轻松找到了问题所在。
原因是,项目中用到了boost 的filesystem。
这个库之前是V2版本,1.53中是V3版本。
V2中有一些函数被删掉了,编译的时候就出错,已经改了。
还有一些函数V2中没有删除,V3中有了新的替代函数,官方建议都换为V3,不过也支持V2的旧函数。
问题就出在旧的函数接口:path.leaf()。这个接口在WINDOWS下正常,但是在LINUX下就有问题,
导致执行low_bound( deque.begin(),deque.end(), path.leaf())的时候陷入死循环。为啥??还不知道。。。。
将其改为新结构path.filename()就正常了。
valgrind是个不错的工具,接下来需要仔细学习一下。