博客
关于我
c++二进制兼容及解决方法
阅读量:644 次
发布时间:2019-03-14

本文共 1172 字,大约阅读时间需要 3 分钟。

二进制兼容的含义和实现

二进制兼容是软件开发中确保程序和库在升级或更换时仍能正常运行的关键技术。以下是关于二进制兼容的详细解析和实现方法。

二进制兼容的定义

二进制兼容ABI全称为Application Binary Interface,主要指动态库文件单独升级时不影响已经使用老动态库的程序。具体来说,当程序A使用库B1.0,库B升级为B1.1时,程序A仍能正常调用B1.1而无异常,这样的设计就是二进制兼容。

判断二进制兼容性的关键

判断一个改动是否二进制兼容,关键在于头文件定义与新动态库的实际使用方法是否兼容。C/C++通过头文件暴露接口,编译器根据头文件生成二进制代码,运行时装载器将程序和动态库绑定。若新库的头文件接口与旧程序的二进制代码接口不兼容,会触发二进制不兼容。

二进制不兼容的示例

以下是常见的二进制不兼容情况:

  • 函数参数类型变化:如从void f(int)改为void f(double),旧程序传递int内存,新库预期double内存,导致错误。

  • 基类虚函数表变化:基类增加或修改虚函数,破坏旧程序中虚表结构,导致调用错误。

  • 增加默认参数:新版本函数加入默认参数,需要用户调整传递参数个数,破坏旧程序逻辑。

  • 改变enum值:枚举类型的值变化,旧程序依赖错误值,导致不可预测的问题。

  • 增加数据成员,改变sizeof:新库扩展类,旧程序无法容纳新结构,导致内存不对齐或越界。

  • 虚函数接口不兼容:虚函数做架子类接口,旧程序依赖特定slot函数,新库slot指向不同函数,导致错误。

  • 库调用方式变化:通过new创建对象或直接访问数据成员,新库size变化,导致旧程序访问无效内存或错误偏移。

  • 默认模板参数变化:函数模板加入默认参数,旧程序不预期特定类型传递,导致错误调用。

  • 二进制兼容的实现场景

    在确保二进制兼容的同时,可以进行以下变化:

  • 增加新类或函数:在新库中添加新类或非虚函数,旧程序不受影响。

  • 增加静态成员函数:旧程序不会调用新函数,不影响运行。

  • 使用pimpl技法:暴露非虚接口,隐藏实现细节,确保旧类结构不变。

  • 常见的二进制不兼容问题

  • 头文件不兼容:新库头文件改变函数名或接口,导致旧程序无法识别。

  • API不一致:函数返回类型、异常处理等变化,导致程序无法适应。

  • abi破坏性更改:修改global宏或宏预定义,破坏旧程序编译模板。

  • 解决二进制不兼容的方法

  • 静态链接:避免动态连接,部署更简单,减少兼容问题。

  • 动态库版本管理:采用隔离版本号,确保更新不影响现有程序。

  • pimpl技法:优化实现细节,确保二进制兼容,提升代码安全性。

  • 小结

    二进制兼容技术确保程序与库无缝升级,提升系统稳定性。通过正确设计接口、谨慎修改可靠性关键点,并结合技术工具如Qt框架,开发者可有效管理兼容性问题,确保系统运行的稳定性和扩展性。

    转载地址:http://niflz.baihongyu.com/

    你可能感兴趣的文章
    R3LIVE开源项目常见问题解决方案
    查看>>
    php缃戠珯,www.wfzwz.com
    查看>>
    php缓存查询函数
    查看>>
    php编写TCP服务端和客户端程序
    查看>>
    php编码规范
    查看>>
    PHP编码规范-PSR1、psr2 /psr3 psr4
    查看>>
    PHP编程效率的20个要点
    查看>>
    PHP网页缓存技术优点及代码
    查看>>
    PHP自动化测试(一)make test 和 phpt
    查看>>
    php自定义函数: 文件大小转换成智能形式
    查看>>
    php英语单词,php常用英语单词,快速学习php编程英语(6)
    查看>>
    R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
    查看>>
    PHP获取curl传输进度
    查看>>
    PHP获取IP所在地区(转)
    查看>>
    PHP获取IP的方法对比
    查看>>
    php获取json里面内容
    查看>>
    R2的版本由来
    查看>>
    PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
    查看>>
    PHP获取当前文件的绝对路径
    查看>>
    PHP获取当前时间、时间戳的各种格式写法汇总
    查看>>