编写多平台编译的C++代码

好东西,学习一下。

存一个到自己的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


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注