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

gcc 链接顺序,静态库循环依赖问题

链接过程由链接器 ld 负责。通常 GCC 间接驱动之。

越底层的库,在链接命令行中的位置应越靠后。

文章目录

  • 链接过程
  • ※ 但是对于静态库,链接器仅提取当前未解析符号所需的对象文件,未使用的对象文件会被丢弃。
      • 静态库(.a)需要在使用它的目标文件之后
      • 循环依赖的静态库

链接过程

.o 目标文件(Object File)
.a 静态库(Static Library)是多个.o的集合

导出符号:.当前编译单元 .o /.a 定义的、可供其他编译单元使用的符号
导入符号:需要导入,但没找到的符号

符号:
    函数声明 与 函数实现
    全局变量
    局部静态变量
这些需要全局使用,所以进程地址空间有个数据段,代码段。
符号表在链接时用来做这些准备~

链接器ld维护两个符号表:

  • 已决符号表A: 遇到的所有.o/.a的导出符号
  • 未决符号表B: 遇到的所有.o/.a需要导入,但尚未找到的符号

链接器对一个 .o 文件的每个符号:

  • 导出符号 加入到 已决符号表A ,若 未决符号表B 存在该符号,则删除。
    若 已决符号表A 已存在该符号,则报错“多重定义”
  • 导入符号 若 已决符号表A 不存在该符号,则添加到表B

※ 但是对于静态库,链接器仅提取当前未解析符号所需的对象文件,未使用的对象文件会被丢弃。

所以:

静态库(.a)需要在使用它的目标文件之后

(原因见上)

g++ main.o -lprotobuf -o client.out

循环依赖的静态库

(原因见上)

如果 libA.a 依赖 libB.a 里的符号,而 libB.a 也依赖 libA.a

g++ main.o -lA -lB -lA -o myapp

这样 libA.a 会被解析两遍,确保所有符号都能找到。

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

相关文章:

  • 「青牛科技」GC5849 12V三相无感正弦波电机驱动芯片
  • RISC-V debug专栏2 --- Debug Module(DM)
  • 在将asc文件导入maxent文件时出现for input string:“nan“
  • (kotlin) Android 13 高版本 图片选择、显示与裁剪功能实现
  • Docker容器部署Java项目的自动化脚本(Shell编写)
  • 动态规划练习题①
  • 蓝桥杯 web 灯的颜色变化(Dom操作及样式动态修改、浏览器解析顺序、定时器)
  • 计算机科学基础设施之数学:科研工具、资源与环境详介
  • qt.qpa.xcb: could not connect to display解决方法
  • Keil5烧录后STM32不自动运行?必须复位才能启动的终极解决方案
  • element-plus中,Upload上传组件的使用 + 后端处理
  • DMA在SPI和I2C通信中的应用详解
  • 解锁异步编程新姿势:CompletableFuture 深度探秘
  • java根据集合中对象的属性值大小生成排名
  • [NOIP 1999 提高组] 导弹拦截
  • C++ STL简单的几个容器
  • I²C总线高级特性与故障处理分析
  • 【leetcode100】每日温度
  • OpenCV 从入门到精通(day_04)
  • 面向对象
  • python实现简单fast-cgi服务,对接到nginx
  • 蓝桥云客 刷题统计
  • 持续集成与Jenkins安装使用教程
  • 分布式锁方案-Redisson
  • Linux命令-tar
  • 使用 MapReduce 进行高效数据清洗:从理论到实践
  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • LabVIEW 调用 Python 函数
  • SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析
  • 天梯赛 L2-023 图着色问题