如何编写跨平台程序?

时间:2010-07-10 00:36:56

标签: cross-platform

我搜索了一些关于跨平台编程开发的文献,但我找不到真正好的东西。

我不是在寻找像Java那样的跨平台虚拟机。

有关于此的书籍或文献吗?

7 个答案:

答案 0 :(得分:7)

我会说这归结为:

  • 不使用非标准“标准库”功能,其中非标准功能取决于您定位的平台(例如POSIX兼容系统)。例如,如果您希望应用程序在非POSIX系统上运行,则使用C时请不要使用popen()
  • 确保在需要的地方正确处理字节序,例如:当您通过网络将数据传输到另一台计算机时,可能使用不同的字节顺序。
  • 只写兼容代码,例如不依赖于GCC / VC / name-your-compiler特定功能。

在更实际的层面上,我的建议是:

  • 使用跨平台库来抽象您需要的非标准功能,或编写代码来处理您所定位的所有平台。
  • 并且,与上述相关,远离非跨平台依赖项。例如。使用OpenGL而不是Direct3D和Qt / Gtk /而不是你的平台本机widget工具包。

编辑:需要考虑更多的事情,比如不假设/被用作路径分隔符,或者对文件名中允许哪些字符做出无效假设。

答案 1 :(得分:4)

@Staffan和其他人已经给出了出色的建议,所以我不打算提供解决方案 - 只是建议一种方法。

有许多可能的解决方案,我想说一个重要的决定是你是否想要一个GUI。如果没有,你可以选择C.使用GUI,使用Java(你不想这样做),或者使用NetBEans作为IDE,使用Qt作为小部件。

但无论你做什么,我认为最重要的是尽早发现潜在的爆发。如果您使用C,则可以使用Splint或其他静态代码分析工具来警告可移植性问题。同样,将编译器警告级别设置为max应该会有所帮助。

建立一个像Hudson这样的持续集成系统来定期构建所有内容并确保你有很多autometd单元测试(使用CppUnit或类似)并在每个平台上使用相同的测试,测试针对可移植性问题。

或许考虑Posix或仅使用Ansi C或其他符合标准的语言。

如何设置CI取决于您拥有多少潜在目标。也许您需要在sepearte PC或sparate VM上运行每个。如果您选择C或C ++,您可能会对使用Windows中的Cygwin下的GCC和您选择的C / C ++编译器感到高兴(需要一个好的免费建议?)

另见:

http://www.hookatooka.com/wpc/

,当然, http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-sg&q=portable+code

答案 2 :(得分:2)

如果您不使用“一次编码,随处运行”开发环境(换句话说,您的某些代码必须针对每个目标平台进行自定义),那么请确保您确实需要运行您的程序多个平台。

我知道一个编译成两个版本的程序,一个用于Mac,一个用于Windows。虽然大多数代码对于任一平台都是相同的,但是一部分特定于主机O / S,并且经常需要对这两个环境特有的修改和测试。销售额为98%Windows,2%Mac,但这两个版本基本上需要相同的设计/编程/测试/文档时间。所有者决定,不是将每个$美元未来程序员时间的一半给予Mac版本仅获得2%的回报,而是简单地将该版本封装起来。他们的跨平台问题立即消失,他们的程序员的工作效率基本上翻了一番(这让Windows客户感到高兴。)

答案 3 :(得分:2)

我要了一本书,但没有人提到它。

我找到了一本名为“C ++中的跨平台开发:构建Mac OS X,Linux和Windows应用程序”的书。

有一个关于亚马逊的链接以及对谁感兴趣的描述:

http://www.amazon.com/exec/obidos/tg/detail/-/032124642X/

   Cross-Platform Development in C++ is the definitive guide to developing 
   portable C/C++ application code that will run natively on Windows, 
   Macintosh, and Linux/Unix platforms without compromising functionality, 
   usability, or quality. 

   Long-time Mozilla and Netscape developer Syd Logan systematically 
   addresses all the technical and management challenges associated with 
   software portability from planning and design through coding, testing, 
   and deployment. Drawing on his extensive experience with cross-platform 
   development, Logan thoroughly covers issues ranging from the use of 
   native APIs to the latest strategies for portable GUI development. Along 
   the way, he demonstrates how to achieve feature parity while avoiding 
   the problems inherent to traditional cross-platform development 
   approaches. 

   This book will be an indispensable resource for every software 
   professional and technical manager who is building new cross-platform 
   software, porting existing C/C++ software, or planning software that may 
   someday require cross-platform support. 

   Build Cross-Platform Applications without Compromise

   Throughout the book, Logan illuminates his techniques with realistic 
   scenarios and extensive, downloadable code examples, including a 
   complete cross-platform GUI toolkit based on Mozilla's XUL that you can 
   download, modify, and learn from. Coverage includes 
     - Policies and procedures used by Netscape, enabling them to ship Web 
   browsers to millions of users on Windows, Mac OS, and Linux 
     - Delivering functionality and interfaces that are consistent on all 
   platforms 
     - Understanding key similarities and differences among leading 
   platform-specific GUI APIs, including Win32/.NET, Cocoa, and Gtk+ 
     - Determining when and when not to use native IDEs and how to limit 
   their impact on portability 
     - Leveraging standards-based APIs, including POSIX and STL
     - Avoiding hidden portability pitfalls associated with floating point, 
   char types, data serialization, and types in C++ 
     - Utilizing platform abstraction libraries such as the Netscape 
   Portable Runtime (NSPR) 
     - Establishing an effective cross-platform bug reporting and tracking 
   system 
     - Creating builds for multiple platforms and detecting build failures 
   across platforms when they occur 
     - Understanding the native runtime environment and its impact on 
   installation 
     - Utilizing wxWidgets to create multi-platform GUI applications from a 
   single code base 
     - Thoroughly testing application portability
     - Understanding cross-platform GUI toolkit design with Trixul

答案 4 :(得分:1)

如果不使用虚拟机,您会遇到同样的问题:您可以在操作系统上使用的许多功能特定于该操作系统。

这是因为从来没有人真正关心定义一种方法来做同样的事情,主要是因为以DirectX10为例比其他操作系统更有优势。

我认为编写一个能够在MacosX和Linux上运行的跨平台应用程序非常容易,因为你可以利用许多可以在两台机器上运行的东西(想想X11或GTK)其中有Unix引擎盖。通常需要付出一些努力,如果缺少某些功能的兼容性,您也可以设法使您的程序在Windows下运行(可能使用MinGW或Cygwin)。

此外,不同的操作系统对相同的东西实际上有不同的实现(想想套接字,io系统,图形,音频等),所以这使得编写一个无处不在的版本变得不可能:你被迫写一个不同的适用于您计划发布程序的任何操作系统的版本。

简短的回答是:不,没有VM语言,除非您将程序功能限制为一小组常用功能,否则不能。

(我假设我们之所以谈论C / C ++只是因为通常其他语言只由一组人管理,每个人都尽可能多地跨平台发布它)

我真的没有看到依赖虚拟机的任何真正的坏点。如今的计算机能够在没有大速度问题的情况下运行VM。然后有一些关心在你和操作系统之间放置一个抽象层的东西会让你通过知道一种方法来做高级事情。我认为像Java这样的速度权衡是广泛接受的......他们只是做了在尝试编写复杂的跨平台应用程序时,您需要做些什么。

只是一个事实:当我尝试将我从Unix(Linux / OSX)编写的虚拟机移植到Windows时,由于freopen函数,我真的很痛苦。不幸的是,Windows以不同的方式管理流。其他操作系统,所以MinGW缺乏这个功能,我不得不找到解决这个问题的方法..

答案 5 :(得分:0)

没有某个Java虚拟机可以在不同的平台上运行。 Java具有在不同平台上运行的不同虚拟机,以便Java程序在每个平台上运行。它是一种使Java程序能够在任何地方运行的层。

例如,一个C程序可以在Windows和Linux上运行,但它应该使用运行该应用程序的操作系统的相应编译器进行编译。

但是在java中,你不需要这样做。您只需编译源代码并分发已准备好在任何平台上执行的已编译文件。

答案 6 :(得分:0)

如果您选择现代脚本语言(Tcl和Python是两个完整的示例),您可以编写在所有平台上运行几乎相同的程序。当然,你必须为一个平台或另一个平台做一些小的补贴,但这很容易做到。看看这些语言的灵感。

您不会使用这些语言创建下一个Photoshop或第一人称射击游戏,但对于绝大多数常见的编程任务,这些都非常合适。

如果你想要具体的东西,看看http://tkdocs.com,展示在多个平台上运行的Tk工具包和多种语言(Tcl,Ruby,Perl,Python)