使用C ++编写跨平台库有哪些最佳实践?
我的开发环境是Linux上的Eclipse CDT,但我的库应该可以在Windows上进行原生编译(例如,从Visual C ++)。
感谢。
答案 0 :(得分:5)
在某种程度上,这将取决于您的图书馆要完成的目标。
例如,如果您正在开发GUI应用程序,则需要专注于使用经过良好测试的跨平台框架,例如wxWidgets。
如果您的库主要依赖于文件IO,那么您需要确保使用现有的经过良好测试的跨平台文件系统抽象库,例如Boost Filesystem。
如果您的库不属于上述类型(即没有现成的经过良好测试的跨平台框架供您使用),最好的办法是确保您遵守标准C ++尽可能多(这意味着不要#include <linux.h>
或<windows.h>
。如果不可能(即您的磁带库从麦克风读取原始声音数据),您将需要确保给定平台的实现细节被充分抽象出来,以便最大限度地减少工作量参与将您的图书馆移植到另一个平台。
答案 1 :(得分:2)
据我所知,你可以做一些事情:
您可以将平台特定代码划分为不同的名称空间。
您可以使用PIMPL idiom隐藏平台特定代码。
您可以使用宏确实知道要编译的代码(在这种情况下代码将是特定于平台的)。有关详细信息,请查看此link。
在多种环境中测试您的图书馆。
根据您的工作情况,使用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文件分开。
跨平台库有许多备选方案,但我的个人偏好是:
最后一个,CMake,在过去几年里对我来说是一个巨大的帮助,因为我在Windows和Windows上进行双重开发时保持了我的构建环境的理智。 Linux操作系统。它有一个相当陡峭的学习曲线,但一旦它启动并运行,它的效果非常好。
答案 6 :(得分:-3)
您的意思是除了在目标平台上持续集成和测试之外?或者除了使用设计抽象出实现细节之外?
不,什么都想不到。