首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-05 02:41
  • 2294
  • 7318
blog.csdn.net

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

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

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

LDFLAGS := -lts -lm
  • 1

这里不作具体的原因分析,这就是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
        
        • 1
  3. Makefile 显式指定路径(因为包含):
    说明:因为链接库的命令常常发生在Makefile文件中,所以这里以Makefile文件中的写法为例。
    如果 libts 不在默认路径中,可以通过 -L 指定自定义路径。例如,如果库位于 /opt/lib,可以这样修改:

    LDFLAGS := -L/opt/lib -lts
    
    • 1

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

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

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

假如命令:

arm-buildroot-linux-gnueabihf-gcc -v
  • 1

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

arm-buildroot-linux-gnueabihf-ld --verbose
  • 1

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

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

这说明其搜索路径如下:

  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.so 或 libm.a 的文件。

库名称解释

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

链接过程

  • 动态库:GCC 会首先寻找 .so 文件(如 libts.so 或 libm.so)。
  • 静态库:如果找不到动态库,GCC 会继续查找 .a 文件(如 libts.a 或 libm.a)。
昊虹嵌入式技术交流群
QQ群名片
注:本文转载自blog.csdn.net的昊虹AI笔记的文章"https://blog.csdn.net/wenhao_ir/article/details/144618488"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top