转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3133

KlayGE 4.6的开发刚刚开始。在目前的开发版里,工程方面有了一定的改进,这里总结一下。

boost的CMake化

在之前boost升级的贴子里有提到,现在包括boost在内的所有第三方库,都已经用CMake进行管理了,bjam被完全删除。这样只要一套编译设置就能应用于KlayGE中的所有项目。修改和移植变得更容易。

编译器支持

在KlayGE 4.5里,我做了一系列的实验,试图用Clang来编译KlayGE。原先遇到了一些Clang的bug,使得编译一直不成功。现在Clang解决了部分问题,KlayGE本身的dll都能通过Clang编译产生了,但exe仍然不行。问题还是出在Clang在Windows上对类的导出,有些函数被遗漏了。

VS14已经发布了两个CTP,现在KlayGE里也增加了对VS14的支持。最大的改动是,VS14会把局部变量覆盖报成warning,而以前只有/analyst打开的时候才有。其他代码都没区别。

RTTI

由于KlayGE的非debug版不用RTTI,打开RTTI造成的空间和时间开销就纯属浪费了。在VC里,即使关掉了RTTI,照样可以使用typeid。而其他编译器里则不能。Boost.Any和Boost.ProgramOptions都用到了typeid,所以关掉RTTI会让它们无法在GCC和Clang下编译。我修改了这两个库,用boost/core/typeinfo.hpp里的伪typeid代替了原生的。但这么做在MinGW下仍有执行问题,似乎是因为MinGW的dll是开RTTI,而不开RTTI的boost shared_ptr去掉用它就会抛出异常。所以目前在非VC下,boost是打开RTTI的,其他关掉RTTI。在VC下,RTTI全关。

Windows Phone

在codeplex上,CMake有了个微软的分支。这个分支专注于增加对WinRT的支持,包括win store和win phone(最早是基于我的补丁,后来发展出了更容易被CMake接受的版本)。所以这里就顺便把KlayGE移植到了WP8上。从原先的WinRT代码移植到WP,一行都不用改。

交叉编译增强

原先只有android用得上交叉编译,而且无法控制android版本号。现在这部分的编译脚本得到增强,可以指定目标android的版本号。同时,win store和win phone也被纳入这套系统,算作交叉编译了。