当前位置: 首页 > news >正文

编译构建C++程序时ABI一致性问题

主程序使用 动态库或者静态库时 要保证 主程序与使用的动态库或者静态库的ABI一致;否则那怕编译通过也可能导致异常崩溃等问题

有四个方面:
1.使用的编译器版本【编译生成主程序与编译生成动态库或者静态库的编译期版本尽量保持一致】
2.debug/Release版本【主程序与动态库或者静态库的debug或者Release版本尽量保持一致】【否则可能出现ABI问题导致异常崩溃】【编译使用Abseil库时已经验证】
3.x86/x64目标平台【目标平台必须保持一致】

4.使用的C++运行时库【只针对静态库有这种情况】=>对于静态库其选择使用的MT,MTD,MD,MDD这些选项要与参与主程序编译时主程序的选项保持一致;否则静态库编译不通过;
对于动态库没有直接这样的限制要求=>即不会导致编译不通过,但是最好还是保证主程序的运行时库与动态库的运行时库一致;否则即便通过编译,也可能在运行时出现ABI异常导致程序崩溃;【编译使用Abseil库时已经验证】
【详见:https://app.yinxiang.com/fx/b4f45f90-cf69-451a-a3c1-8dff9d77d3ed】

编译静态库时 可以任意使用 MT MTD MD MDD 多线程运行时库
编译动态库时 也可以任意使用MT MTD MD MDD 多线程运行时库

多线程运行时库方面:
实际上考虑ABI一致性问题,无论在编译执行程序,动态库,静态库时=>尽量选择与编译的debug/Release版本一致的运行时库版本【即最好在Debug/Release选择上一致;而至于使用静态运行时库还是动态运行时库任意】
=>即:
根据目标项目的 Debug模式 任意选择 MTD,MDD;
根据目标项目的Release 任意选择 MT,MD;

主程序-动态库/静态库方面:
当其他工程使用 静态库时,因为静态库最终要编译打包到整个程序内部,所以 其他工程编译使用的多线程运行时库的版本要与编译静态库时使用的多线程运行时库版本一致;否则编译不通过

而对于动态库,其他工程只是调用动态库接口,动态库本身并不打包进执行程序PE文件中;所以不要求主工程与动态库编译时使用的多线程运行时库版本一致;即不会因为这个出现编译不通过问题;但是最好还是保证主程序的运行时库与动态库的运行时库一致;否则即便通过编译,也可能在运行时出现ABI问题导致程序异常崩溃;

这样从 主程序,其链接的动态库/静态库;以及这些目标使用的运行时库 三个方便都严格保证ABI一致性

http://www.dtcms.com/a/235601.html

相关文章:

  • Java设计模式之状态模式详解
  • Unity基础-数学向量
  • NY118NY120美光固态闪存NY124NY129
  • 高股息打底+政策催化增强+永续经营兜底
  • 每日算法 -【Swift 算法】电话号码字母组合
  • CSS6404L 在物联网设备中的应用优势:低功耗高可靠的存储革新与竞品对比
  • 本机无法远程别的计算机的方法
  • MySQL查询语句(续)
  • C++.OpenGL (1/64) 创建窗口(Hello Window)
  • python八股文算法:三数之和
  • GIT(AI回答)
  • JS面试常见问题——数据类型篇
  • 传输层:udp与tcp协议
  • 【递归、搜索与回溯】专题三 穷举vs暴搜vs回溯vs剪枝
  • Python获取网易云音乐的评论
  • Java-前置基础
  • Kafka 入门指南与一键部署
  • S5P6818_驱动篇(24)UART驱动
  • IoT/HCIP实验-4/单片机基础实验(LCD/LED/按键操作/GPIO/EXTI中断服务)
  • untiy 模拟人物在街道走路和跑步
  • Java中==和equals的区别
  • 理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
  • sklearn 和 pytorch tensorflow什么关系
  • 12.vite,webpack构建工具
  • 【Linux 学习计划】-- 简易版shell编写
  • 刷题记录(7)二叉树
  • 六、【ESP32开发全栈指南:深入解析ESP32 IDF中的WiFi AP模式开发】
  • 欧拉定理和费马定理
  • Gerrit+repo管理git仓库,如果本地有新分支不能执行repo sync来同步远程所有修改,会报错
  • 飞牛使用Docker部署Tailscale 内网穿透教程