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

    你可能感兴趣的文章
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
    查看>>
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    Oracle中序列的操作以及使用前对序列的初始化
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle中表和视图的区别,oracle中常用表和视图
    查看>>
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    查看>>
    Oracle从11g导出后导入10g
    查看>>
    oracle从备份归档日志的方法集中回收
    查看>>
    oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
    查看>>
    Oracle修改字段类型
    查看>>
    Oracle修改表或者字段的注释
    查看>>