跨平台库的开发

6

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

我的开发环境是Linux上的Eclipse CDT,但我的库应该有可能在Windows上本地编译(例如从Visual C++编译)。

谢谢。


1
我可以问一下这个库是用来做什么的吗?可能已经有适用于几乎所有事情的跨平台库了。 - jmucchiello
7个回答

5
在某种程度上,这将取决于您的库旨在实现什么。
例如,如果您正在开发GUI应用程序,则应专注于使用经过充分测试的跨平台框架,如wxWidgets
如果您的库主要依赖于文件IO,则应确保使用现有的经过充分测试的跨平台文件系统抽象库,如Boost Filesystem
如果您的库不属于以上任何一种情况(即没有现有的经过充分测试的跨平台框架可供使用),您最好确保尽可能遵守标准C++(这意味着不要像#include <linux.h><windows.h>这样)。当这不可能时(即您的库从麦克风读取原始声音数据),您需要确保给定平台的实现细节被足够抽象化,以便最小化移植库到另一个平台所需的工作量。

True。此外,[http://www.gtk.org/download-windows.html glib]为所有最底层的类C功能(如malloc和strcmp)提供抽象。 - Pat Wallace
作为补充,我想要补充的是,通常将特定于平台的代码(如果有)分离到自己的模块中非常有用。您的其余代码与平台无关,并且可以通过调用接口函数执行特定于平台的任务。这样,移植库的过程就会简化(在很大程度上)成为移植那个单独的模块。 - bta
1
我想指出的是,您不一定希望强制需要另一个库。有些人可能希望它能够独立工作(STL是一个例外,因为它是C++标准的一部分)。 - Alerty
@Mark,多平台库是如何制作的?它们如何实现跨平台,是否使用每个平台的API(例如boost文件系统是否使用每个系统的API来管理文件,因为我无法想象其他的方法,因为C++语言甚至不理解目录是什么)? - AnotherOne

2
据我所知,您可以做以下几件事情:
  1. 将平台特定的代码分成不同的命名空间。

  2. 使用PIMPL惯用语来隐藏平台特定的代码。

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

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

  5. 根据您的需求,可能需要使用诸如Boost之类的库,因为它不特定于某个平台。缺点(或可能是好处)是您将强制使用所包含的库。


1

根据我的实践经验,有几点建议:

1)确保你的目标平台中源代码的定期编译。不要等到最后。这将有助于早期发现错误。使用持续构建系统--这会让生活变得更加轻松。

2)永远不要使用特定于平台的头文件。即使是用于编写本地代码--因为你永远不知道某些 Windows 头文件中的某些内容可能期望一些字符串,在 XP 中为 ABC,但在 Win7 中则变为 ABC.12。

3)使用 STL 和 BOOST 的思想,然后在它们的基础上进行构建。但永远不要认为这些是问题的万灵药--STL 很容易随代码一起发布,但 BOOST 不行。

4)不要使用编译器特定的结构,例如 __STDCALL。这是在寻求麻烦。

5)相同的代码,在 g++ 和 cl 中使用类似的编译器选项编译可能会导致不同的行为。请始终随身携带编译器手册的一份副本。


0
每当我处理类似的事情时,我都会尝试在我想要支持的不同环境中构建它。同样,如果您正在制作一个网页,并且希望确保它在IE、Firefox和Chrome中正常工作,您应该在这三个浏览器中测试它。在您想要支持的不同环境中进行测试,您就会知道可以安全地说它适用于哪些系统。

网站开发和应用程序开发是非常不同的。 ;) - Alerty
不是根据我所写的上下文来理解。你需要在打算使用的每个平台上测试你的代码。 - Ben Burnett
我同意你的观点。唯一的问题是Alon可能对Web开发一无所知。 - Alerty
其实,我来自于网站开发的背景 :) - Alon Gubkin

0

问题有点抽象,但你可以考虑使用QT。


-2

这其实就像是“不要使用特定于平台的任何东西”一样简单。如今有大量免费可用的工具,以C++编写跨平台代码变得轻而易举。对于那些罕见但偶尔需要使用特定于平台的API的情况,只需通过 #define 将它们分离出来,或者更好的方式是为每个平台创建独立的 .cpp 文件。

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

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

最后一个,CMake,在过去几年中对我非常有帮助,可以在 Windows 和 Linux 上进行双重开发时保持我的构建环境清晰明了。它有着相当陡峭的学习曲线,但一旦运行起来,它的表现异常出色。


1
-1:你可以使用特定平台的代码。只需要采取必要措施,使得该代码不会被编译到某个特定环境中即可。 - Alerty
你建议的第一件事是不要使用特定于平台的代码。更不用说,当不是最佳操作时,你建议使用现有库。当然,你说可以使用特定于平台的代码。问题在于,你把这定义为罕见但偶尔的情况,而不知道Alon正在做什么类型的库。 - Alerty
@Alerty 你说得对。我只是那些认为一般问题值得一般回答的疯子之一。不过别担心,通过纸艺和锡纸的神奇组合,我的心灵读取装置很快就会准备好 :) - Rakis
@Rakis,多平台库是如何制作的?它们如何实现跨平台,是否使用每个平台的API(例如boost文件系统是否使用每个系统的API来管理文件,因为我无法想象其他方法,因为C++语言甚至不理解目录是什么)? - AnotherOne
跨平台库在必要时使用特定于平台的API,但将其抽象化以使库消费者免受平台特定差异的影响。通常,这会导致最低公共分母问题,其中不能公开支持每个库支持的平台上不存在的功能。您指出的目录问题是一个很好的例子,因为并非所有系统都具有相似的“目录”定义,尽管所有平台都有字节的命名顺序系列的概念,也就是“文件”。即使如此,具体细节也有所不同。 - Rakis

-3

除了在目标平台上进行持续集成和测试之外,您还指的是什么?或者除了使用设计来抽象实现细节之外?

不,我想不到其他的了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接