作为C++库 API 一部分的第三方类型以及潜在的 ABI 不一致

Third-party types as part of a C++ library's API and potential ABI inconsistencies

本文关键字:不一致 ABI 第三方 C++ API 一部分 作为 类型      更新时间:2023-10-16

这是对上一个问题的跟进。

我正在开发一个库,客户需要为其提供复杂的类型,如矩阵和四元数。在内部,我将使用 Eigen 来操作这些类型,根据链接问题中的讨论,我可能会在 Eigen 的类型周围放置一个薄包装器,并要求客户端将这些类型提供给我的库,本质上将 Eigen 隐藏为内部实现细节。

由于我的一些客户实际上可能已经在使用 Eigen,因此有人建议我在 Eigen 类型的包装版本中提供某种往返 Eigen 函数。

这一切听起来都不错,但我担心如果我的库在内部使用与我的客户端使用的不同版本的 Eigen 会发生什么。如果两个版本与 ABI 兼容,那么我认为没有任何问题。但是,如果不是,那么我可以想象一些"坏"事情正在发生。我特别担心,因为 Eigen 是一个仅标头库,例如,我不能假设我的库和我的客户端都会链接到第三方库的同一编译版本。

如果我为用户提供源代码并让他们自己针对 Eigen 进行编译,那么我就不必太担心了。但是,我最关心的是我为用户编译和安装 DSO/DLL 的情况。

所以,我想我的问题是:我是否必须限制我的客户端使用与 ABI 兼容的库版本?我可以为特征提供必要的标头,但是用户已经在使用特征会出现问题。

我想

我可以把它留给我的客户对我的包装器类型进行必要的转换,但我想提供便利的功能。

请注意,虽然我特别谈论的是 Eigen,但这个问题可能适用于任何提供类型的第三方库。

谢谢!

提供自己的类型绝对是最通用的方法,并确保人们可以在没有第三方库(即 Eigen(的情况下使用 OR 使用您的库。 由于您永远无法希望涵盖客户端可能使用的所有可能的第三方库,因此我建议将转换功能留给您的最终用户/实现者。

如果提供转换/便利功能非常重要,那么只需在单独的源文件中实现它们并直接提供给您的客户;一点点糖衣以向他们表明您的关心。

顺便说一句,我认为您总是希望在可用的情况下使用"标准"结构。 我知道STL没有"矩阵"或"四元数"数据类型,但Boost,而且Boost几乎可以接近标准,而无需实际进入标准。 因此,这为您提供了另一种可能性。