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

MinGW-w64是另一组人做的修改版GCC,比起原先的MinGW,它的好处是可以编译出x64和x86的Windows程序,而且对Windows API的支持更好。原先用MinGW编译KlayGE的时候,需要对MinGW的头文件(或者说w32api的头文件)做一些修改,才能完成。如果用MinGW-w64,会不会好些呢?

版本的选择

和其他第三方的MinGW一样,由于选项的不同,MinGW-w64在Windows上其实有多个不同的版本。C++ Exceptions有DWARF、SJLJ、SEH三种处理方式;GCC Threading Model有Win32和Posix两种实现;编译器本身还分Win32和Win64的,虽然都可以交叉编译出x86和x64的代码。这些方式组合爆炸后,最终的binary版本就眼花缭乱了。我这里测试的是x32-4.8.1-release-win32-sjlj-rev5,其他的应该也不会有结果上的区别。

编译成x86

对cmake和DSound插件的代码作略微修改后,KlayGE可以直接用MinGW-w64的-m32模式编译。完全不需要动MinGW-w64本身的头文件。这方面明显强于MinGW了。

编译成x64

在尝试编译成x64的时候遇到了麻烦。Boost.Thread就已经连接不过了,说少了InterlockedCompareExchange。其他部分的Interlocked*系列函数也都报连接错误。根据这个帖子,这是个MinGW-w64的bug,只能等他们修正了。需要注意的是,在cmake脚本里,-m64需要加在所有的CXX_FLAGS以及所有的LINKER_FLAGS里,缺一不可。

后记:在这里找到了一个解决方案。只要在编译和使用boost的时候都定义了BOOST_USE_WINDOWS_H宏,就能避免这个连接错误。

总结

由于MinGW-w64的优异表现,以后KlayGE正式测试的编译器将不再用MinGW,而切换到MinGW-w64。