gcc的链接器的相关知识要点(库的书写顺序、搜索库的路径、库的全名....)

01-gcc的链接器在链接多个库时要注意顺序:被依赖的库应该放在依赖它的库之后

链接顺序规则为:
被依赖的库应该放在依赖它的库之后。
换种说法,越是被别人调用的越底层的库,就越放在后面;越是调用别人的越上层的库,就越放在前面。

比如我在Makefile中书写规则时,如果有库ts和库m需要链接,并且库ts需要依赖于库m,那么我需要像下面这样写:

LDFLAGS := -lts -lm

这里不作具体的原因分析,这就是gcc的一个规则和机制,死记住就行了。

02-gcc的链接器在链接库时去哪里查找库?

默认的库搜索路径

默认的库搜索路径如下:

  1. 标准系统库路径

    • /usr/lib
    • /usr/local/lib
    • 系统架构相关的库路径(如 /lib/x86_64-linux-gnu/usr/lib64
  2. 环境变量指定的路径

    • 环境变量 LD_LIBRARY_PATH 中的路径。
      • 例如:如果库 libts.so 位于 /custom/lib,可以通过以下命令添加路径:
        export LD_LIBRARY_PATH=/custom/lib:$LD_LIBRARY_PATH
        
  3. Makefile 显式指定路径(因为包含)
    说明:因为链接库的命令常常发生在Makefile文件中,所以这里以Makefile文件中的写法为例。
    如果 libts 不在默认路径中,可以通过 -L 指定自定义路径。例如,如果库位于 /opt/lib,可以这样修改:

    LDFLAGS := -L/opt/lib -lts
    

如果库ts放在Makefile 文件所在目录的子目录 lib 中,可以像下面这样写:

TOPDIR := $(shell pwd)
LDFLAGS := -L$(TOPDIR)/lib -lts

如何用命令查看链接器的库搜索路径

假如命令:

arm-buildroot-linux-gnueabihf-gcc -v

能正常执行,那么可以用下面这条命令可以查看对应的gcc的链接器的库搜索路径:

arm-buildroot-linux-gnueabihf-ld --verbose

运行结果截图如下:
在这里插入图片描述
截图中红框的内容如下:

SEARCH_DIR("=/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/host/arm-buildroot-linux-gnueabihf/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");

这说明其搜索路径如下:

  1. /home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/host/arm-buildroot-linux-gnueabihf/lib
  2. /usr/local/lib
  3. /lib
  4. /usr/lib
    我们可以把我们编译好的第三方库文件放在 /usr/local/lib中,原因是从下面的三张截图中可以看出,/usr/local/lib才应该是给用户放库的地方。
    /usr/local/lib的截图如下:
    在这里插入图片描述
    /lib的截图如下:
    在这里插入图片描述
    /usr/lib的截图如下:
    在这里插入图片描述

03-如何从给gcc链接器的参数推测库的全名?

以参数 -lts 和 -lm 为例进行说明。

  • -lts:表示链接名为 libts 的库。这里的 ts 是库的名字,GCC 会查找名为 libts.so(动态库)或 libts.a(静态库)的文件。
  • -lm:表示链接名为 libm 的数学库。m 是数学库的名字,GCC 会查找名为 libm.solibm.a 的文件。

库名称解释

  • -l<name>-l 选项后跟的是库的名称,不需要包含前缀 lib 或扩展名(如 .so.a)。例如:
    • -lts 对应的库是 libts.solibts.a
    • -lm 对应的库是 libm.solibm.a

链接过程

  • 动态库:GCC 会首先寻找 .so 文件(如 libts.solibm.so)。
  • 静态库:如果找不到动态库,GCC 会继续查找 .a 文件(如 libts.alibm.a)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值