【Linux 日常】设置动态链接库目录

本文介绍两种设置LD_LIBRARY_PATH的方法:一是临时添加,重启后失效;二是永久添加,并通过修改/etc/ld.so.conf文件及执行ldconfig命令来更新共享库配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path_to_add
该方式为临时的,系统重启则失效。

方法二:
sudo vim /etc/ld.so.conf

添加库路径
保存后
执行命令 sudo ldconfig

可通过ldd 查询可执行文件的依赖项是否正确。
如:

root@VM-0-12-ubuntu:~/ocr/work# ldd /usr/local/bin/tesseract 
linux-vdso.so.1 =>  (0x00007ffec1fe6000)
libtesseract.so.4 => /usr/local/lib/libtesseract.so.4 (0x00007faee8cb4000)
liblept.so.5 => /usr/local/lib/liblept.so.5 (0x00007faee8843000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(0x00007faee84b4000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007faee829d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faee7ed3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 
(0x00007faee7cb6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007faee79ac000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007faee778a000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007faee7570000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007faee734a000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007faee70f1000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007faee6e7d000)
    /lib64/ld-linux-x86-64.so.2 (0x000055a48fa6a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faee6c78000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007faee6a56000)
libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007faee6847000)
### Linux 下动态库与静态库的区别 #### 一、定义区别 静态库是在编译阶段被完全嵌入到可执行程序中的库文件,其扩展名通常是 `.a`[^2]。而动态库则是在运行时由操作系统加载器加载并链接的共享对象文件,其扩展名通常是 `.so`(Shared Object)。尽管可以通过后缀初步判断库的类型,但这并非绝对标准[^3]。 --- #### 二、存储方式差异 静态库的内容会在编译过程中直接复制到最终生成的可执行文件中,因此生成的可执行文件较大。相比之下,动态库不会将库代码嵌入到可执行文件中,而是保持独立存在,在多个应用程序间共享同一份副本[^1]。 --- #### 三、性能影响 由于静态库在编译时已全部集成至目标程序中,因此在启动速度上可能稍占优势。然而,如果需要频繁更新或修复某些功能模块,则动态库更为灵活——只需替换对应的 `.so` 文件即可完成升级而不需重新编译整个项目。 --- #### 四、内存利用率对比 当多个进程都依赖同一个函数集合时,使用动态链接可以显著减少物理 RAM 的消耗量,因为这些公共部分只需要驻留在内存一次供所有调用者共同访问;而对于每一个单独构建出来的应用来说,它们各自携带了一份完整的静态版本数据结构描述表等资源信息,从而增加了整体系统的负担。 --- #### 五、创建方法概述 ##### 静态库制作流程: 假设有一组源码文件 `foo.c`, `bar.c` 可以按照如下命令行操作步骤来进行打包处理得到相应的档案形式产物: ```bash gcc -c foo.c bar.c ar rcs libmy.a foo.o bar.o ``` 这里 `-c` 参数指示只做预处理器以及汇编工作不进入最后一步生成机器指令环节; 而工具 `ar` 则负责把前面产生的目标单元组合成所需的存档格式. ##### 动态库制造指南: 对于希望获得更轻便易维护解决方案的需求方而言, 创建 SO 类型产品相对复杂一点: ```bash gcc -shared -fPIC -o libmy.so foo.c bar.c ``` 其中选项解释如下: - `-shared`: 告诉 GCC 正处于生产可供外部引用实体状态. - `-fPIC`: 生产位置无关代码(Position Independent Code),这是为了适应不同地址空间布局策略所必需的一项技术措施. --- ### §相关问题§ 1. 如何验证某个特定路径下的文件究竟是属于哪种类型的库? 2. 在实际开发环境中遇到符号重复定义错误该如何解决? 3. 如果我的项目既需要用到一些固定不变的基础组件又有一些经常变动的功能插件应该怎样设计架构才能达到最佳平衡效果呢? 4. 当前主流 IDE 对于管理这两种不同类型资源的支持程度怎么样? 是否有推荐使用的辅助插件或者脚本简化日常管理工作负荷吗 ? 5. 存在一个已经存在的第三方闭源 SDK ,只知道它提供了若干头文件和几个不明所以的对象文件(.obj), 我们能否自行将其转换为目标平台兼容的标准格式以便进一步利用 ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值