在跨平台库上工作

时间:2010-06-03 16:21:26

标签: c++ windows linux eclipse compilation

使用C ++编写跨平台库有哪些最佳实践?

我的开发环境是Linux上的Eclipse CDT,但我的库应该可以在Windows上进行原生编译(例如,从Visual C ++)。

感谢。

7 个答案:

答案 0 :(得分:5)

在某种程度上,这将取决于您的图书馆要完成的目标。

例如,如果您正在开发GUI应用程序,则需要专注于使用经过良好测试的跨平台框架,例如wxWidgets

如果您的库主要依赖于文件IO,那么您需要确保使用现有的经过良好测试的跨平台文件系统抽象库,例如Boost Filesystem

如果您的库不属于上述类型(即没有现成的经过良好测试的跨平台框架供您使用),最好的办法是确保您遵守标准C ++尽可能多(这意味着不要#include <linux.h><windows.h>。如果不可能(即您的磁带库从麦克风读取原始声音数据),您将需要确保给定平台的实现细节被充分抽象出来,以便最大限度地减少工作量参与将您的图书馆移植到另一个平台。

答案 1 :(得分:2)

据我所知,你可以做一些事情:

  1. 您可以将平台特定代码划分为不同的名称空间。

  2. 您可以使用PIMPL idiom隐藏平台特定代码。

  3. 您可以使用宏确实知道要编译的代码(在这种情况下代码将是特定于平台的)。有关详细信息,请查看此link

  4. 在多种环境中测试您的图书馆。

  5. 根据您的工作情况,使用Boost等库可能会很好,因为它不是特定于平台的。缺点(或可能是好的一面)是你将强制使用你所包含的库。

答案 2 :(得分:1)

我的实践经验提出了一些建议:

1)确保定期编译目标平台中的源代码。不要等到最后。这有助于尽早指出错误。使用连续构建系统 - 它使生活变得更加容易。

2)切勿使用特定于平台的标头。甚至不用于编写本机代码 - 对于所有你知道的东西,在Windows标题中可能会期望一些字符串在XP中是ABC但在Win7中被改为ABC.12。

3)使用来自STL和BOOST的想法,然后在它们之上构建。永远不要认为这些是解决问题的灵丹妙药 - STL很容易随你的代码一起提供,但BOOST不是。

4)不要使用像__STDCALL这样的编译器特定结构。这要求下地狱。

5)在g ++和cl中使用类似的编译器选项编译时,相同的代码可能会导致不同的行为。请准备一份编译器手册。

答案 3 :(得分:0)

无论何时我在这样的事情上工作,我都会尝试在我想要支持的不同环境中构建它。同样,如果您正在创建一个网页,并且您想确保它在IE,Firefox和Chrome中有效,那么您将在所有这三种浏览器中对其进行测试。在您想要支持的不同环境中进行测试,您就会知道可以安全地说它适用的系统。

答案 4 :(得分:0)

所述的问题不是抽象的。但你可以给AT考虑

答案 5 :(得分:-2)

它真的就像“不使用任何特定平台”一样简单。如今可用的大量免费工具使得用C ++编写跨平台代码变得轻而易举。对于那些您确实需要使用平台特定API的罕见但偶然的情况,请确保通过#defines将它们分开,或者在我看来,更好地将每个平台的.cpp文件分开。

跨平台库有许多备选方案,但我的个人偏好是:

  • GUI:Qt
  • 操作系统抽象(尽管Qt本身做得很好):Boost
  • 跨平台Makefile:CMake

最后一个,CMake,在过去几年里对我来说是一个巨大的帮助,因为我在Windows和Windows上进行双重开发时保持了我的构建环境的理智。 Linux操作系统。它有一个相当陡峭的学习曲线,但一旦它启动并运行,它的效果非常好。

答案 6 :(得分:-3)

您的意思是除了在目标平台上持续集成和测试之外?或者除了使用设计抽象出实现细节之外?

不,什么都想不到。