`
Riddick
  • 浏览: 640582 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C++的可移植性和跨平台开发[5]--操作系统

阅读更多

上一个帖子提到了"硬件体系"相关的话题,今天来说说和操作系统相关的话题。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

分享到:
评论

相关推荐

    C++的可移植性和跨平台开发-编译器-操作系统-硬件体系

    C++的可移植性和跨平台开发-编译器-操作系统-硬件体系 如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列。即使你目前没有跨平台开发的需要,了解可移植性方面的知识对...

    C++跨平台开发技术指南.pdf

    接着,作者深入探讨了如何利用基于标志的API进行开发,特别是POSIX(可移植操作系统接口)和标准模板库(STL),这些是跨平台开发中的关键工具。POSIX为Unix-like系统提供了一套标准化的API,使得开发者可以编写在...

    c++跨平台开发

    总之,C++跨平台开发是一项复杂但值得投入的任务,它不仅可以扩大应用的受众范围,还可以提高代码的重用率和开发效率。通过采用上述策略和技术,开发者可以有效地克服跨平台开发中的挑战,创建出高质量、高可移植性...

    C++设计模式--基于Qt4开源跨平台开发框架

    在跨平台开发方面,Qt4的移植性极强,其底层的QApplication和QWidget类能够适应多种操作系统,如Windows、Linux、macOS等。这使得开发者能够使用相同的设计模式和代码结构,实现一次编写,到处运行的目标。比如,...

    C++跨平台处理UTF-8库

    在C++编程中,处理...总之,这个C++跨平台处理UTF-8的库是解决C++与Unicode交互问题的有效工具,它增强了C++的标准库功能,使得开发者能够在不同平台上以一致的方式处理多语言文本,提高软件的可移植性和用户体验。

    C++跨平台开发技术指南 中英文版 pdf

    这些是进行跨平台开发的基础,因为它们确保代码的可移植性和复用性。 接下来,作者深入讨论了跨平台开发的关键问题,如处理操作系统差异、文件系统接口、线程与并发、网络编程以及图形用户界面(GUI)构建。在不同...

    跨平台开发的一些资料合集

    从C++的基础到深入的MacOS和Android开发,再到实现软件可移植性的策略,每一个部分都对理解和掌握跨平台开发的核心概念至关重要。通过深入学习这些内容,开发者可以拓宽自己的视野,提高代码复用性,降低维护成本,...

    基于C++语言下的跨平台软件开发设计研究

    跨平台软件开发是指利用统一的软件设计和开发技术,使得软件产品能够在不同的操作系统和硬件平台上运行,而不需要针对每个平台做特别的修改。C++语言因其高效和强大的编程能力,在跨平台软件开发领域占有重要地位。...

    c++ 跨平台线程 线程池

    - 在C++中,这样的库可以帮助开发者编写无需关心底层操作系统差异的代码,提高代码的可移植性。 4. **testthreadpool.cpp**: - 这个文件很可能是线程池的测试程序,用于验证`threadpool.c`和`threadpool.h`的...

    《C/C++编写跨平台程序:实践篇》

    C/C++作为一种广泛支持的系统编程语言,具有强大的功能和性能,但在编写跨平台程序时,它的一个主要问题是直接暴露系统级API和内存对象布局,使得程序员在不同操作系统之间移植代码时会遇到障碍。为了解决这一问题,...

    C++ QT5跨平台界面编程从入门到实战

    - **QT5概述**:QT5是一款广泛应用于图形用户界面(GUI)开发的跨平台工具包,支持Windows、Linux、MacOS等操作系统。它提供了一套完整的API用于简化应用程序的开发流程,特别适用于那些需要高度定制化界面的应用。 ...

    用C++编写跨平台程序

    wxWidgets,最初名为wxWindows,是一个开源的跨平台C++库,提供了一整套界面元素、工具和API,使得开发者能够创建同时支持Windows、Mac和Linux等操作系统的应用程序。 首先,使用C++编写跨平台程序的基本理念包括...

    基于嵌入式Linux的具有可移植性的C++程序开发框架

    在IT行业中,嵌入式系统和物联网(IoT)领域的发展日新月异,而“基于嵌入式Linux的具有可移植性的C++程序开发框架”正是这些领域的重要工具之一。 Embedme,作为这样一个框架,旨在简化Linux应用程序的开发过程,...

    跨平台的C++程序开发框架

    标题和描述中提到的“跨平台的C++程序开发框架”通常是指能够在多种操作系统上运行的C++编程框架,如Windows、Linux、macOS等。这样的框架为开发者提供了统一的API,使得代码可以在不同的平台上无缝迁移,提高了软件...

    C++跨平台开发库win32版

    标题 "C++跨平台开发库win32版" 指出这是一份适用于C++编程的跨平台开发库,特别针对Windows 32位环境进行了...使用这些库,开发者可以编写一次代码,然后在多种操作系统上运行,极大地提高了代码的可移植性和效率。

    visual c++数据通用模块开发与系统移植

    系统移植涉及到跨平台编程,即编写可以在多种操作系统上运行的代码。对于C++来说,这通常需要利用标准模板库(STL)和跨平台API,如POSIX或Windows API。我们将研究如何编写平台无关的代码,使用条件编译指令来处理...

    纯标准c++实现的跨平台INI文件解析类

    标题中的“纯标准c++实现的跨平台INI文件解析类”指的是使用纯C++语言编写的一个类库,它能够解析和操作INI配置文件,并且可以在多种操作系统上运行,体现出跨平台特性。INI文件是一种常见的轻量级配置文件格式,...

    C++ Qt6 跨平台开发(机翻).zip

    C++ Qt6 跨平台开发是一项重要的技术,它允许开发者使用C++语言构建可以在多个操作系统上运行的应用程序,包括Windows、Linux、macOS、Android以及iOS等。Qt库提供了丰富的功能,涵盖了图形用户界面(GUI)、网络...

    使用Qt6和C++语言进行跨平台开发

    使用Qt6和C++语言进行跨平台开发 在当下的软件开发领域,跨平台开发已经成为一个不可或缺的技术需求。作为一名软件开发者,我们需要能够在不同的操作系统上运行我们的应用程序,而不管是Windows、Linux还是Mac OS。...

Global site tag (gtag.js) - Google Analytics