C/C++程序编译与链接(五) 定位库文件
创始人
2025-06-01 03:00:54
0

文章目录

    • 在构建过程中定位库
      • 静态库的命名规则
      • 动态库的命名规则
      • 运行时动态库的定位规则
        • `LD_LIBRARY_PATH`
        • ld.so.cache

定位库文件包括两个方面:

  • 在程序构建时,需要知道所依赖库的位置及头文件。
  • 在程序运行时,需要知道所依赖库的位置,只针对动态库。

只有动态库在程序运行时加载,静态库是构建时就已经链接到程序中。

在构建过程中定位库

静态库的命名规则

lib + library name +.a

library name才是静态库实际的名字,比如libtest.a,库名为test

动态库的命名规则

lib + library name + .so + library version information

动态库相比静态库多了库的版本信息,指定了版本信息后,库名一样版本不同也是不同的库,因为包含的符号不同。经常遇见依赖多个不同版本的动态,版本号是区分这些库的重要方式。
库的实际名字也是library name
在构建时不管是依赖的静态库还是动态库,指定所依赖的库的路径都是一致的,通过通过-L-l选项来指定构建过程中库文件的路径。
gcc main.o -L../lib -ltestlib -o test
-L是指定库的目录,-l是指定库名就是库的实际名字,-ltestlib对应的库为libtestlib.so或libtestlib.a

  • -L告诉编译器用于定位库的目录。
  • -l 对于动态库,指定的库名还会写入最终生成的执行文件,在程序运行时,加载器会查找指定的库,但是定位库的规则就不是按-L的规则了。

-l后面也可以跟路径+库名的方式,比如:
gcc main.o -l/home/test/lib/libtestlib.so -o test
但是这种方式,-l后面的内容会全部写入执行文件,在程序运行时,加载器会按照固定的位置/home/test/lib/libtestlib.so加载动态库。如果编译机与运行机不一样,那么就会因为找不到库而运行失败。

运行时动态库的定位规则

按照优先级的如下规则:

  1. LD_LIBRARY_PATH
  2. ld.so.cache
  3. 默认库路径(/lib/和/usr/lib等)

动态库的定位,还有更高优先级的rpathrunpath,这两个值会被写入动态库或执行程序ELF文件。但是这个两个配置的决策过程比较复杂,并且还面临着gcc版本不同处理方式不同的问题。所以这里没有列出它们。通常我们使用LD_LIBRARY_PATHldconfig就足以。

LD_LIBRARY_PATH

设置环境变量LD_LIBRARY_PATH是我们在开发过程中经常使用的方式,但这并不是标准方式,通常临时验证下程序的正确性,可以配置该环境变量,如下:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录

ld.so.cache

ld.so.cache是加载器(ld.sold-linux.so)的定位库目录的缓存文件。可以通过ldconfig工具更新它。
一种标准的代码部署过程是基于ldconfig工具,它通常是包安装过程中的最后一步,通常需要将指向包含库目录的路径作为出输入参数传递,将其写入ld.so.cache文件,保证加载器能定位到所依赖的库。

ldconfig creates the necessary links and cache to the most recent shared libraries found in the directories specified on the command line, in the file /etc/ld.so.conf, and in the trusted directories (/lib and /usr/lib).

ldconfig会搜索指定的目录,/etc/ld.so.conf,系统库默认目录/lib/usr/lib。将其中库的路径信息写入/etc/ld.so.cach,它被链接器(ld.sold-linux.so)用于查找依赖库。

ldconfig还有一个重要的功能是更新动态库的版本,这个会在后面的文件详细介绍。

所以当我们需要定位我们自己的所依赖的库时,可以将目录直接写入/etc/ld.so.conf中,但是/etc/ld.so.conf通常是如下内容:

cat /etc/ld.so.conf
include ld.so.conf.d/*.conf

**include ld.so.conf.d/*.conf**表示包含了**/etc/ld.so.conf.d/**目录下所有文件,所以我们通常是在该目录下建立一个包含所依赖库目录的conf文件。

#ls -lrt /etc/ld.so.conf.d/
-rw-r--r-- 1 root root 19 8月   9 2019 dyninst-x86_64.conf
-rw-r--r-- 1 root root 17 4月   3 2020 mariadb-x86_64.conf
-rw-r--r-- 1 root root 26 6月   1 2020 bind-export-x86_64.conf
-r--r--r-- 1 root root 63 8月  26 2020 kernel-3.10.0-1127.19.1.el7.x86_64.conf
#ldconfig

再通过ldconfig让其更新目录到/etc/ld.so.cach文件中,可以通过ldconfig -p查看cach中缓存的动态库及其路径信息,确认是否已经写入(ldconfig -p | grep 依赖的动态库)。

相关内容

热门资讯

原创 生... 标题:生煎包,馅料的秘密,皮薄馅大有汤汁,一口下去汤汁儿直流! 在这个快节奏的时代,美食不仅仅是味...
“粤”上新台阶丨水果千千万 广... 谁都知道荔枝是“岭南佳果”。但在广东,如果你还只是把荔枝当成一种普通水果,那可就大大低估了广东人对它...
原创 我... 我家做芹菜炒蘑菇这菜,从来不放肉,一把芹菜,再配上些鲜蘑菇,清清淡淡但又营养满满,而且特别下饭。炒这...
吕文扬与元诚的新疆游记:天山徒... 飞机降落在乌鲁木齐地窝堡国际机场时,吕文扬透过舷窗看到了远处连绵的雪山轮廓。他拍了拍身旁正在打瞌睡的...
四川6天旅游路线推荐:四川报团... 四川6天旅游路线推荐:四川报团旅游6天费用,超实用干货分享!超棒攻略 四川之旅,一场味蕾与心灵的盛宴...
海口火山荔枝王采摘攻略来了!3... 🌞🌞🌞 湛蓝湛蓝的天空 大朵大朵的云彩 海口的夏天 空气里满是荔枝香甜~ 黝黑火山石上孕育的海口火...
假期余额不足,这些地方依然有惊... 传统 过端午,迎世运,游公园城市 “五月五,是端阳,门插艾,香满堂。”当端午的艾香浸润天府新区的街巷...
和朋友去张家界5日旅游跟团报价... 最近刚计划了一次张家界的五天四晚旅行,想着既能放松心情又能看看大自然的鬼斧神工。张家界旅游五天四晚旅...
机票价格“跳水” 突现1.1折... 近期,机票价格处于“跳水季”。记者在多家在线旅游平台上看到,目前从杭州萧山国际机场出发前往三亚、成都...
梧州潘塘公园荷花开,市民赏景度... 6月1日,游人在梧州市万秀区潘塘公园,赏荷游玩,乐享假日。 游人在梧州市万秀区潘塘公园,赏荷游玩,...
官方消息:2025年全国三支一... 最新消息 2025年全国三支一扶招募34430人! 消息全文如下: 各省、自治区、直辖市及新疆生产建...
印度游客摸老虎自拍遭袭击,攻击... 记者 | 何博奇 △视频截图 泰国普吉岛知名观光景点“老虎王国”近日发生一起惊险事件。一名印度游客...
原创 惊... 你能想象吗?明星一家出游本是温馨画面,可张馨月却因一个细节被网友 “疯狂输出”!这背后到底咋回事?咱...
和朋友去张家界五日游报团费用,... 这次的旅行计划是和几个朋友一起报了一个张家界五日游的团,原本还在纠结自由行还是跟团,后来在朋友推荐下...
错过等一年!来上海这些公园,打... 夏天到啦,上海人的朋友圈马上就要被“莫奈美景”刷屏了!没错,魔都的睡莲从6月进入盛花期,各大公园的水...
人气出“粽”!端午假期首日五台... 马晓琴 文勇 王丹 五台山管委会 端午假期首日,五台山景区迎来旅游高峰,来自全国各地的游客齐聚五...