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

    你可能感兴趣的文章
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>