小智 37
语言本身是跨平台的,但大多数库都不是,但如果你想在C++编程时想要完全跨平台,你应该记住三件事.
首先,您需要开始使用某种跨平台构建系统,如SCons.其次,您需要确保所使用的所有库都是跨平台构建的.第三点,我建议使用存在于所有目标平台上的编译器,这里考虑gcc(C++是一个相当复杂的野兽,所有编译器都有自己特定的怪癖).
我有一些关于图形用户界面的进一步建议.有几个可供使用,最值得注意的三个是:
GTK +和QT是两个带有自己的小部件集(按钮,列表等)的API ,而wxWidgets更像是当前运行的平台本机小部件集的包装API.这意味着两个前者与系统的其他部分相比可能看起来有点不同,而后者看起来就像本机程序.
如果你正在进行游戏编程,那么有很多API可供选择,所有这些都是跨平台的.我所知道的两个最全面的功能是:
两者都包含从图形到输入和音频例程的所有内容,可以通过插件或内置.
此外,如果您觉得C++中的标准库有点缺乏,请查看Boost以获得一些通用的跨平台甜头.
祝好运.
Kla*_*azt 13
C++是跨平台的.您似乎遇到的问题是您正在使用平台相关库.
我假设你真的在谈论UI组件 - 在这种情况下我建议使用像GTK +,Qt或wxWindows这样的东西 - 每个都有可以为不同系统编译的UI组件.
唯一的解决方案是您找到并使用独立于平台的库.
并且,在旁注中,cygwin或Wine都不是仿真 - 它们是相同功能的100%原生实现,并且发现了它们各自的系统.
一旦你意识到了陷阱,它实际上并不那么难.我目前正在处理的所有代码都编译在32位和64位Windows,各种Linux,以及Unix(Sun,HP和IBM)上.显然,这些不是GUI产品.此外,我们不使用第三方库,除非我们自己编译它们.
我有一个.h文件,其中包含所有特定于编译器的代码.例如,Microsoft和gcc在如何指定8位整数方面存在分歧.所以在.h,我有
#if defined(_MSC_VER)
typedef __int8 int8_t;
#elif defined(__unix)
typedef char int8_t;
#endif
Run Code Online (Sandbox Code Playgroud)
还有相当多的代码可以统一某些低级函数调用,例如:
#if defined(_MSC_VER)
#define SplitPath(Path__,Drive__,Name__,Ext__) _splitpath(Path__,Drive__,Dir__,Name__,Ext__)
#elif defined(__unix)
#define SplitPath(Path__,Drive__,Name__,Ext__) UnixSplitPath(Path__,Drive__,Name__,Ext__)
#endif
Run Code Online (Sandbox Code Playgroud)
现在在这种情况下,我相信我必须编写一个UnixSplitPath()函数 - 有时您需要.但大多数时候,你只需要找到正确的替换功能.在我的代码中,我将调用SplitPath(),即使它不是任何平台上的本机函数; #defines会为我排序.训练自己需要一段时间.
信不信由你,我的.h文件只有240行.这真的不多.这包括处理endian问题.
一些较低级别的东西需要条件编译.例如,在Windows中,我使用Critical Sections,但在Linux中我需要使用pthread_mutex.CriticalSection被封装在一个类中,这个类有很多条件编译.但是,上层程序完全没有意识到,无论平台如何,类的功能都完全相同.
我能给你的另一个秘诀是:经常在所有平台上构建你的项目(特别是在开始时).当您将编译器问题扼杀在萌芽状态时,这会容易得多.在尝试跨平台之前,不要等到完成开发之后.
| 归档时间: |
|
| 查看次数: |
6149 次 |
| 最近记录: |