好东西,学习一下。
存一个到自己的BLOG。
使用C++编写软件的时候,经常需要同时在多个OS/Compiler平台上编译。在进行设计决策的时候,事先考虑到跨平台的需求,能够有效的减少后期的工作量。
在代码编写时,尽量避免使用OS/Compiler相关API或者语言扩展。这里有一些建议,比如,在做GUI时,不要使用MFC,否则在类 UNIX平台就要完全重写了。可以使用一个可移植的GUI工具,比如使用TCL/TK来编写界面或者使用一个可以在多个平台上使用的GUI库,著名的有 wxWindows。在需要使用线程或者同步原语的地方,可以使用一些多平台的库,比如使用boost中的线程,或者专用的多平台线程库,比如 ZThread。实在无法避免的,就使用编译开关#ifdef、#endif。另外,如果要支持的UNIX平台种类很多,还要注意,有些OS上的编译器对模版的支持不太好。
除了代码,还有一个很重要的是Makefile。在Windows上,如果使用VC,可以用工程文件,也可以使用VC的nmake编译 Makefile。在Unix上,编写大工程的支持工具有autoconf和automake。autoconf可以自动的生成configure脚本, configure脚本能够全面检测不同的OS和Compiler的特征,为编译C++代码提供了很大的方便。
生成configure,最重要的是configure.in和一组m4文件构成。不同的m4文件分别检测系统的不同特征,然后再 configure.in中指定使用那些m4;automake负责从用户编写的Makefile.am中生成Makefile.in文件。最后在编译时,使用经典的三个步骤;
./configure
make
make install
就可以编译所有的代码了。
一个要注意的问题,不同平台的make的语法可能不同,在solaris上臭名卓著的“Unexpect end of line seen”错误很难解决,推荐使用GNU make。
将autoconf、automake和daily build技术结合,能很好的发挥他们的作用。
如果对autoconf和automake工具没有信息,可以考虑一个新的Makefile生成工具。推荐CMake,它可以生成几乎所有平台的Makefile,甚至包括VC和Borland公司的make。
不论使用什么工具,编译多平台编译代码都是一个tedious、error prone的过程。
原文: http://www.blogbus.com/blogbus/blog/diary.php?diaryid=428246
发表回复