作为C++库 API 一部分的第三方类型以及潜在的 ABI 不一致
Third-party types as part of a C++ library's API and potential ABI inconsistencies
这是对上一个问题的跟进。
我正在开发一个库,客户需要为其提供复杂的类型,如矩阵和四元数。在内部,我将使用 Eigen 来操作这些类型,根据链接问题中的讨论,我可能会在 Eigen 的类型周围放置一个薄包装器,并要求客户端将这些类型提供给我的库,本质上将 Eigen 隐藏为内部实现细节。
由于我的一些客户实际上可能已经在使用 Eigen,因此有人建议我在 Eigen 类型的包装版本中提供某种往返 Eigen 函数。
这一切听起来都不错,但我担心如果我的库在内部使用与我的客户端使用的不同版本的 Eigen 会发生什么。如果两个版本与 ABI 兼容,那么我认为没有任何问题。但是,如果不是,那么我可以想象一些"坏"事情正在发生。我特别担心,因为 Eigen 是一个仅标头库,例如,我不能假设我的库和我的客户端都会链接到第三方库的同一编译版本。
如果我为用户提供源代码并让他们自己针对 Eigen 进行编译,那么我就不必太担心了。但是,我最关心的是我为用户编译和安装 DSO/DLL 的情况。
所以,我想我的问题是:我是否必须限制我的客户端使用与 ABI 兼容的库版本?我可以为特征提供必要的标头,但是用户已经在使用特征会出现问题。
我想我可以把它留给我的客户对我的包装器类型进行必要的转换,但我想提供便利的功能。
请注意,虽然我特别谈论的是 Eigen,但这个问题可能适用于任何提供类型的第三方库。
谢谢!
提供自己的类型绝对是最通用的方法,并确保人们可以在没有第三方库(即 Eigen(的情况下使用 OR 使用您的库。 由于您永远无法希望涵盖客户端可能使用的所有可能的第三方库,因此我建议将转换功能留给您的最终用户/实现者。
如果提供转换/便利功能非常重要,那么只需在单独的源文件中实现它们并直接提供给您的客户;一点点糖衣以向他们表明您的关心。
顺便说一句,我认为您总是希望在可用的情况下使用"标准"结构。 我知道STL没有"矩阵"或"四元数"数据类型,但Boost有,而且Boost几乎可以接近标准,而无需实际进入标准。 因此,这为您提供了另一种可能性。
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- void 函数中的指针参数返回不一致的值
- 如何查找导致结果不一致的代码
- 跨平台 mySQL 与字符集不一致
- C++:不一致的 std::p ow( 类型 ) 定义
- 作为C++库 API 一部分的第三方类型以及潜在的 ABI 不一致