如何处理不稳定的API的全球使用的框架
How to deal with unstable API of a globally used framework
情况:
我们的首席架构师创建了一个C++库;运行时";对于我们的工作领域(它们实际上是几个库——想想sdl、sdl_net、sdl_ttf,但是有一个C++接口,它们总是应该一起使用,即使您可能只需要其中一个(。
也就是说,这些库链接到一堆CRUD应用程序、其他(更具体的(库(想想基于sdl的sprite库(和更大规模的应用程序(客户端/服务器、远程GUI(。
问题:
由于一系列原因(当然,时间不够,是其中之一(;运行时";图书馆仍有变动。可能会引入新的类,现有的类可能会被拉入类层次结构,方法参数可能会更改等等。由于没有ABI,链接运行时的代码将中断,并且在没有适当版本控制的情况下动态链接时,生产软件将崩溃。
拒绝的解决方案:
- 对运行库的更改应该引入一个新版本。当
myrt.so.2
发货时,链接到myrt.so.1
的二进制文件仍然可以工作,因为myrt.so.1
(在一段时间内(不会被删除
拒绝的理由:将会有很多新的库版本"污染";生产环境。最坏的情况是每个二进制文件都有自己的myrt
版本。
- 静态链接
拒绝的原因:加上明显的膨胀,上面的最后一句话实际上也适用于此。
- 可能保留两个
myrt
版本,并重建在运送新的myrt
时可能会中断的依赖关系
拒绝的原因:没有时间测试所有依赖项的功能(只有很少的自动测试(,并且运送未经测试的二进制文件的风险被认为太高。
问题:
我们还能做什么?你认为有什么方法可以通过处理拒绝声明来恢复其中一个拟议的解决方案吗?
它可能是在纠正症状而不是原因(缺乏自动测试,缺乏真正创建稳定的API的资源等(。老实说,我看不到解决更大问题的方法,尽管已经采取了更好的测试措施。
第四个解决方案
以向后兼容的方式更改库的ABI。但这并不容易。复杂性取决于类的初始体系结构(d指针的使用等(。您可能需要引入一个巨大的突破来更改类的体系结构,以便在未来安全地添加ABI。
在这个领域有用的文章:
- https://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
- https://techbase.kde.org/Policies/Binary_Compatibility_Examples
- http://lvc.github.io/abi-compliance-checker/#Articles
ABI兼容性自动化分析的有用工具:
- abi合规性检查器
- abi翻斗车
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- 如何使用 AWS Transcribe C++ API 中的'StartTranscriptionJobRequest'?
- 将std::string传递给WriteConsole API
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- catch框架有没有办法比较流或文件
- 在gtest.中使用fff.h模拟系统API
- 有没有任务栏API可以立即应用注册表更改
- C++win32 API创建多个类似视口的窗口
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何将真正的字符串从python c-api转换为python脚本
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用Qt框架在c ++类中创建API调用
- Libreoffice API (UNO):需要更改用户的 xTextField 文本
- Android Camera2 API-实时显示处理的框架
- 如何将C API集成在机器人框架中
- 在FireBreath框架中使用Win32 API CreateProcess
- 如何处理不稳定的API的全球使用的框架