博客
关于我
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/

    你可能感兴趣的文章
    OneASP 安全公开课,深圳站, Come Here, Feel Safe!
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    oobbs开发手记
    查看>>
    OPEN CASCADE Curve Continuity
    查看>>
    Open Graph Protocol(开放内容协议)
    查看>>
    Open vSwitch实验常用命令
    查看>>
    Open WebUI 忘了登入密码怎么办?
    查看>>
    open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
    查看>>
    open3d-Dll缺失,未找到指定模块解决
    查看>>
    Openbox-桌面图标设置
    查看>>
    opencart出现no such file or dictionary
    查看>>
    opencv Mat push_back
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>