繁体   English   中英

在跨平台库上工作

[英]Working on a cross platform library

在C ++中编写跨平台库的最佳实践是什么?

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

谢谢。

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

例如,如果您正在开发GUI应用程序,那么您可能希望专注于使用经过良好测试的跨平台框架,例如wxWidgets

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

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

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

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

  2. 您可以使用PIMPL惯用法隐藏特定于平台的代码。

  3. 您可以使用宏确实知道要编译的代码(在这种情况下代码将是特定于平台的)。 请查看此链接以获取更多信息。

  4. 在多种环境中测试您的库。

  5. 根据您正在做的事情,使用诸如Boost之类的库可能会很好,因为它不是特定于平台的。 缺点(或可能是好的一面)是您将强制使用您包含的库。

根据我的实践经验提出的几点建议:

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

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

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

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

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

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

如上所述的问题有点抽象。但你可以考虑QT

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

跨平台库有很多替代方案,但我的个人偏好是:

  • GUI: Qt
  • 操作系统抽象(虽然Qt本身做得很好): 提升
  • 跨平台Makefile: CMake

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

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

不,想不出什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM