上一个帖子提到了"硬件体系"相关的话题,今天来说说和操作系统相关的话题。C++跨平台开发中和OS相关的琐事挺多,所以今天会啰嗦比较长的篇幅,请列位看官见谅 :-)
为了不绕口,以下把Linux和各种Unix统称为Posix系统。
★文件系统(FileSystem以下简称FS)
刚开始搞跨平台开发的新手,多半都会碰上和FS相关的问题。所以先来聊一下FS。归纳下来,开发中容易碰上的FS差异主要有如下几个:目录分隔符的差异;大小写敏感的差异;路径中禁用字符的差异。
为了应对上述差异,你要注意如下几点:
1、文件和目录命名要规范
在给文件和目录命名时,尽量只使用字母和数字。不要在同一个目录下放两个名称相似(名称中只有大小写不同,例如foo.cpp与Foo.cpp)的文件。不要使用某些OS的保留字(例如aux、con、nul、prn)作文件名或目录名。
补充一下,刚才说的命名,包括了源代码文件、二进制文件和运行时创建的其它文件。
2、#include语句要规范
当你写#include语句时,要注意使用正斜线"/"(比较通用)而不要使用反斜线"\"(仅在Windows可用)。#include语句中的文件和目录名要和实际名称保持大小写完全一致。
3、代码中涉及FS操作,尽量使用现成的库
已经有很多成熟的、用于FS的第三方库(比如boost::filesystem)。如果你的代码涉及到FS的操作(比如目录遍历),尽量使用这些第三方库,可以帮你省不少事情。
★文本文件的回车CR/换行LF
由于几个知名的操作系统对回车/换行的处理不一致,导致了这个烦人的问题。目前的局面是:Windows同时使用CR和LF;Linux和大部分的Unix使用LF;苹果的Mac系列使用CR。
对于源代码管理,好在很多版本管理软件(比如CVS、SVN)都会智能地处理这个问题,让你从代码库取回本地的源码能适应本地的格式。
如果你的程序需要在运行时处理文本文件,要留意本文方式打开和二进制方式打开的区别。另外,如果涉及跨不同系统传输文本文件,要考虑进行适当的处理。
★文件搜索路径(包括搜索可执行文件和动态库)
在Windows下,如果要执行文件或者加载动态库,一般会搜索当前目录;而Posix系统则不尽然。所以如果你的应用涉及到启动进程或加载动态库,就要小心这个差异。
★环境变量
对于上述提到的搜索路径问题,有些同学想通过修改PATH和LD_LIBRARY_PATH来引入当前路径。假如使用这种方法,建议你只修改进程级的环境变量,不要修改系统级的环境变量(修改系统级有可能影响到同机的其它软件,产生副作用)。
★动态库
如果你的应用程序使用动态库,强烈建议动态库导出标准C风格的函数(尽量不要导出类)。如果在Posix系统中加载动态库,切记慎用RTLD_GLOBAL标志位。这个标志位会Enable全局符号表,有可能会导致多个动态库之间的符号名冲突(一旦碰到这种事,会出现匪夷所思的运行时错误,极难调试)。
关于动态库的话题比较大,限于篇幅,以后单独写一个帖子讨论。
★服务/看守进程
如果你不清楚服务和看守进程的概念,请看维基百科(这里和这里)。为了叙述方便,以下统称服务。
由于C++开发的模块大部分是后台模块,经常会碰到服务的问题。编写服务需要调用好几个系统相关的API,导致了与操作系统的紧密耦合,很难用一套代码搞定。因此比较好的办法是抽象出一个通用的服务外壳,然后把业务逻辑代码作为动态库挂载到它下面。这样的话,至少保证了业务逻辑的代码只需要一套;服务外壳的代码虽然需要两套(一个用于Windows、一个用于Posix),但他们是业务无关的,可以很方便地重用。
★默认栈大小
不同的操作系统,栈的默认大小差别很大,从几十KB(据说Symbian只有12K,真抠门)到几MB不等。因此你事先要打听一下目标系统的默认栈大小,如果碰上像Symbian这样抠门的,可以考虑用编译器选项调大。当然,养成"不在栈上定义大数组/大对象"的好习惯也很重要,否则再大的栈也会被撑爆的。
本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2009/0930/15965.php
分享到:
相关推荐
Qt具有广泛适应性及良好的可移植性,编写过的C++语言代码,只需在其他不同的操作系统平台中重新编译一遍,即可重复使用。 编程平台包括Windows 98、Windows XP、Vista、Win8、Mac OS X、Linux Solaris、HP-UX以及...
运行环境为Windows 2000及以后的操作系统,Windows 98需要安装UNICODE支持包。 X3插件框架目前在局部范围内开放源码,还未在公共开源网站范围正式开放。可以学习研究、任意修改改进,但不可以换成其他作者另外发布...
在目前的跨平台GUI框架中,Qt成熟度最高,已经被一些大公司应用在关键产品中。由于Trolltech对Qt采用的dual license模式,该产品既可以从开源社区获得支持,又能够赚取足够的商业利润,因此其前景也令人比较有信心。...
Linux操作系统是现在流行的一种免费的操作系统,它完全符合POSIX标准,拥有强大的网络功能和良好的可移植性,系统的开发就是基于这个平台。为了用户操作的方便,系统用QT来实现系统的用户界面,它 是一个跨平台的 ...
QT/E 是跨平台的C++图形用户界面(GUI)工具包,它是著名的Qt开发商TrollTech发布的面向嵌入式系统的Qt 版本,Qt 是目前KDE等项目使用的GUI 支持库,许多基于Qt的XWindow程序可以非常方便地移植到嵌入式Qt/Embedded ...
Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...
Linux操作系统是现在流行的一种免费的操作系统,它完全符合POSIX标准,拥有强大的网络功能和良好的可移植性,系统的开发就是基于这个平台。为了用户操作的方便,系统用QT来实现系统的用户界面,它 是一个跨平台的 ...
本系列文章来自 Building Your Own Plugin Framework,主要内容是讨论使用 C/C++ 语言开发跨平台的插件框架所需要的架构、开发方法以及部署。我们将从分析现有插件/组件系统开始,一步步深入了解如何开发插件框架,...
Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...
在Windows操作系统上运行的java程序,不做任何修改,可以直接放到Linux操作系统上运行,这个被称为java程序的可移植性(跨平台)。java的跨平台性是通过JVM(java虚拟机)实现的,java代码不直接与底层操作系统打...
可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...
libcurl是一个用C语言编写的...除了以上功能之外,libcurl还具有良好的可移植性和跨平台性,支持Windows、Linux、macOS等操作系统,并且提供了多种语言的绑定,如C++、Java、Python、Perl等。 总之,libcurl是一个强大
Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...
可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...
可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...
Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...
可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...
Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...
Java是一种面向对象的高级程序设计语言,其显著特点是“一次编写,到处运行”(Write Once, Run Anywhere),这得益于其跨平台的特性——通过Java虚拟机(JVM)将源代码编译成可移植的字节码,在任何安装了Java运行...
<br/>移动设备应用程序的跨平台解决方案 平台支持 <br/>ECDS-MUI基于C++语言开发,利用ECDS-MUI SDK应用接口可以方便的跨越Symbian S60 1st、2nd、3rd,SmartPhone 2003,Pocket PC 2003,Windows ...