不久以前,KlayGE附带的boost破例升级到了1.56.0。随着boost的开发进度重回正轨,1.57又如期发布了。所以KlayGE第三方库的boost再次回到传统的只更新单数版本的规则。
在boost 1.57之前,any用的是C++原生的typeid,在使用的时候必须打开编译器的RTTI。于是我提交了一个补丁,让any使用Boost.Core中的一个替代typeinfo。由于现在有了更完善的Boost.TypeIndex,any可以直接使用它。这样就能在不打开RTTI的情况下使用any。再加上1.57更好地兼容了WinRT和Android,原先很多修改变得不必要了。这么一来,要在KlayGE支持的所有平台上都使用boost,需要修改的地方前所未有地少了。
接下去我还打算把Boost.SmartPtr等地方用到typeid的也都改成 ...
传统上,KlayGE集成的是单数版本的boost。但这次1.56的开发周期实在太长了,原定2月份出来的,足足延期了6个月。原因应该是他们在往git上迁移,并且在做模块化的重构。现在每个boost库的头文件、源文件和帮助文件都在一个单独的git库里,通过submodule的方式加到boostorg这个上层git库中。
还好,对使用boost来说,差别不大,照样可以永远原先的方法编译和使用。所以和升级Python不同的是,把boost升级到1.56.0没有遭遇太大的麻烦。
补丁
在之前的版本里,为了在WinRT和Android上使用boost,需要打很多补丁,修改很多地方才行。这些修改在这几个版本的boost里被逐渐集成进去,所以补丁的数量减少了很多。尤其是,微软的OpenTech团队直接 ...
boost 1.55.0前两天发布了。长期以来KlayGE中集成的boost源代码是用的都奇数版本号的boost,上一个是1.53,所以这次1.55也要集成进来。
除了用bcp缩减boost的大小之外,由于boost在开发的时候没有考虑WinRT和Android这样的平台,所以每次集成后都需要做一些修改才能让boost通过所有的编译。纵观这次的1.55.0,需要修改的地方比以往的都少得多了。主要原因来自几方面:
KlayGE从4.3开始引入C++11。原先需要修改的一些库,比如Chrono、Thread、SmartPtr,都因为不再使用boost的实现而没有去修改。
bjam和Config已经支持vc12,所以不需要自己打补丁。
Endian改用新增的Predef库,已经支持Android和ARM。
Boost.Filesystem已经支持A ...
KlayGE的源代码包里带了包括boost在内的所有第三方库。如果使用完整版的boost,那么大小会吃不消的。因为只用了boost中很少的一部分(列表在这里),以前用的方法是手工删掉了libs和tools等目录下所有不使用子目录,以及帮助文件和例子。通过这样的缩减,已经让boost从356M减少到了96.8M。但是,头文件的目录仍不容易直接删减,因为互相依赖很大。
上周空明流转大牛说他在SALVIA里也遇到了类似的问题,打算用boost自带的bcp工具处理一下。所以我也做了一下测试,用bcp来砍掉所有不用的库:
bcp atomic chrono filesystem program_options regex system thread algorithm any array assert assign bind circular_buffer container foreach ...
上次对各编译器对C++11的支持比较之后,很多观众提议加入Intel C++ Compiler(ICC)和Clang。这次修订还加入了在VC11 Nov 12 CTP中对C++11的提升。上回表中的Yes/No标识也被我改成了写明支持一个feature的最低版本号,feature的顺序也调整了一下。为了方便查询,还加入了Proposal的链接。
C++11 Core Language Features
Language Feature
Proposal
MSVC
GCC
ICC
Clang
替代方案
Rvalue references
N2118
10.0
4.3
12.0
2.9
Boost.Move
Rvalue references for *this
N2439
No
No
No
2.9
Initialization of class objects by rvalues
N1610
9.0
4.3
11.1
2.9
Non-static data membe ...
在KlayGE首次引入C++11特性之后,我顺便调研了一下个主流编译器对C++11的支持度,以便在下个版本中加入更多的C++11元素。这里还列出了在不支持的时候,可以采用的替代方案。主要参考了C++11 Features in Visual C++ 11,Status of Experimental C++0x Support in GCC 4.6,Status of Experimental C++0x Support in GCC 4.7,Boost。
C++11 Core Language Features
VC 10
VC 11
GCC 4.6
GCC 4.7
替代方案
Rvalue references
Yes
Yes
Yes
Yes
Boost.Move
Rvalue references for *this
No
No
No
No
Non-static data member initializers
No
No
No
Yes
Variadic templates
No
No
Yes
Y ...
[zh]
在PC上的C++开发中,boost已经很普遍。但对于Android这样的移动平台呢?由于KlayGE正在移植Android,作为依赖库之一的boost也必须移植过去。官方的boost并没有提供Android支持,看来得自己做了。
受MysticTreeGames的Boost-for-Android启发,我想用最新的Crystax NDK来编译boost 1.47。
准备工作
需要下载
boost 1.47
Crystax's NDK r6
MysticTreeGames的Boost-for-Android
补丁
首先,MysticTreeGames的补丁是基于boost 1.45和官方的NDK r5,在最新版上不一定能完美运作。因为有些源文件在1.45到1.47的过程中更改了,无法自动打上补丁。所以我手工地在原始的boost 1.47上根据补丁进行修改。其实不太难,因为只有12 ...