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

上个月底,我第一次尝试用Clang来编译KlayGE,遇到了很多麻烦,而且最终卡在了mangling的bug上。昨天更新了svn上的LLVM和Clang,惊奇地发现那个bug已经被修正了。这么一来,编译dll不再是问题,可以生成正确的binary。

新麻烦1

自己编译出clang 3.5.0的svn版之后,再次试图编译boost。原先boost并不支持Windows版的clang,所以我改了tools下的工具链,加入了clang-win.jam。结果说不认识-mthreads。去掉这个编译选项之后,编译链接通过,能生成boost的dll。但是文件名不对。首先是MinGW的情况下,首选的dll名应该以lib起头。其次,生成的文件名都是boost_*-35-mt-1_55.dll这样的形式,缺了toolset名,正确的应该是libboost_*-clang35-mt-1_55.dll。搜了一下发现这也是一个三年前就有的feature request。经过对bjam的跟踪,最终确定了bug所在,修好之后提交给boost了。

新麻烦2

至此,所有第三方库、KFL、glloader、DXBC2GLSL、kfont和MeshMLLib都能用clang顺利编译。在编译KlayGE本身的时候又出了状况。在Boost.Interprocess里,它为了不依赖于windows.h,自己在boost/interprocess/detail/win32_api.hpp声明了一套用到的Windows API。而这个声明和MinGW的windows.h里面的不一致。其他编译器都容忍这个行为,而clang却不能。目前还没看到有补丁。

总结

目前看来胜利在望。如果Boost.Interprocess能修掉那个bug,就很有希望达到最终目标。