Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解

code review!

文章目录

  • Linux笔记之LD_LIBRARY_PATH详解
    • 1.常见使用命令来设置动态链接库路径
    • 2.LD_LIBRARY_PATH详解
      • 设置 `LD_LIBRARY_PATH`
      • 举例
      • 注意事项
    • 3.替代方案
      • 使用标准路径
      • 编译时指定链接路径
      • 优先使用 rpath 还是 runpath?
      • 注意事项

1.常见使用命令来设置动态链接库路径

export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH 

命令 export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH 在类 Unix 操作系统中用来设置环境变量 LD_LIBRARY_PATH,以便在运行时包含一个含有共享库的目录。这里是命令的详细解释:

  • export:这个 shell 内置命令用来导出环境变量,这样它就可以被 shell 启动的任何子进程使用。

  • LD_LIBRARY_PATH:这是一个环境变量,动态链接器在运行时用它来找到共享库(.so 文件)。当你运行一个依赖共享库的可执行文件时,动态链接器会使用 LD_LIBRARY_PATH 中列出的目录来定位这些库。

  • =$PWD/lib:这将 LD_LIBRARY_PATH 设置为包含当前工作目录($PWD)中的 lib 目录。PWD 环境变量包含当前工作目录的路径。

  • :$LD_LIBRARY_PATH:冒号 : 是一个分隔符,它允许你将多个目录附加到 LD_LIBRARY_PATH。这部分命令将现有的 LD_LIBRARY_PATH 内容附加到新值的前面,这样新目录就会首先被搜索,然后是之前设置的目录。

综合起来,这个命令将当前工作目录的 lib 目录添加到 LD_LIBRARY_PATH 的开头,并将这个更新后的路径导出到随后执行的程序的环境中。

这在你想要运行依赖于不在动态链接器标准查找位置(如 /lib/usr/lib)的共享库的程序时非常有用。通过设置 LD_LIBRARY_PATH,你可以引导动态链接器在额外的目录中搜索。

请注意,通常认为使用 LD_LIBRARY_PATH 是最后的手段,因为如果不能将库安装到标准位置或调整动态链接器的配置文件时才会使用,因为它可能会导致版本和兼容性问题。通常最好将其用于临时或开发目的,而不是作为库路径解析的永久解决方案。

2.LD_LIBRARY_PATH详解

LD_LIBRARY_PATH 是一个环境变量,用于在Linux和类Unix操作系统中指定动态链接器搜索共享库时应查看的目录的列表。动态链接器用于加载和链接应用程序在运行时需要的共享库(动态库,通常是.so文件)。

默认情况下,动态链接器会按照一定的规则(例如查看 /lib/usr/lib 等目录)来搜索这些共享库。但是,如果你的应用程序使用了非标准路径中的共享库,或者你想覆盖默认的库版本,你可以设置 LD_LIBRARY_PATH 来告诉动态链接器在哪些额外的目录中查找。

设置 LD_LIBRARY_PATH

你可以通过在命令行中导出环境变量来设置 LD_LIBRARY_PATH,如下所示:

export LD_LIBRARY_PATH=/path/to/mylibs:$LD_LIBRARY_PATH

这里,/path/to/mylibs 应该替换为实际的目录路径。如果有多个目录,可以用冒号分隔它们。注意,$LD_LIBRARY_PATH 在末尾包括了原始的 LD_LIBRARY_PATH 值,这样可以在添加新路径的同时保留旧的路径。

举例

假设你有一个应用程序需要使用位于 /home/user/mylibs 目录中的共享库。你可以这样设置环境变量:

export LD_LIBRARY_PATH=/home/user/mylibs:$LD_LIBRARY_PATH

然后运行你的应用程序。动态链接器现在会首先在 /home/user/mylibs 目录中查找共享库,如果在那里找不到,再按照默认的规则进行搜索。

注意事项

虽然 LD_LIBRARY_PATH 很方便,但过度使用或不当使用可能会导致一些问题:

  1. 安全性:如果不小心设置了错误的路径,可能会加载到错误的库,这可能会导致安全问题或应用程序崩溃。
  2. 依赖性:依赖于 LD_LIBRARY_PATH 的应用程序可能在其他环境中运行起来比较困难,因为它需要确保环境变量被正确设置。
  3. 维护性:长期依赖 LD_LIBRARY_PATH 可能会导致维护难度增加,尤其是在多用户系统或复杂的部署环境中。

为了避免这些问题,通常推荐的做法是尽可能使用标准路径来安装共享库,或者使用如 rpathrunpath 这样的链接器选项在编译时指定库的搜索路径。

3.替代方案

为了避免使用 LD_LIBRARY_PATH 可能带来的问题,可以采用以下方法确保动态链接器能够找到共享库:

使用标准路径

将共享库安装到系统的标准路径下(如 /usr/lib/lib),这样动态链接器默认就会在这些路径下查找所需的库。这通常需要管理员权限,因为涉及到修改系统目录。

编译时指定链接路径

在编译和链接应用程序时,可以使用链接器(如 ld)的选项来指定共享库的路径。这种方法在编译时将库的路径固定到二进制文件中,减少了运行时的路径搜索和环境变量的依赖。

  • rpath: 使用 -rpath 选项可以指定运行时搜索路径,链接器会将这个路径写入到二进制文件中。例如:

    gcc -o myapp myapp.c -L/path/to/mylibs -lmylib -Wl,-rpath,/path/to/mylibs
    

    这里 -L 选项告诉编译器在哪个目录下搜索库文件,-l 选项指定库的名称,-Wl,-rpath,/path/to/mylibs 告诉链接器添加一个 rpath

  • runpath: 类似于 rpath,但是如果设置了 LD_LIBRARY_PATH 环境变量,LD_LIBRARY_PATH 会优先于 runpath。使用 runpath 的语法类似于 rpath

    gcc -o myapp myapp.c -L/path/to/mylibs -lmylib -Wl,-rpath-link,/path/to/mylibs
    

优先使用 rpath 还是 runpath?

  • 如果你希望 LD_LIBRARY_PATH 环境变量能够覆盖编译时设置的路径,使用 runpath 是一个更好的选择。
  • 如果你希望编译时设置的路径总是被使用,即使存在 LD_LIBRARY_PATH 环境变量,那么 rpath 是更好的选择。

注意事项

  • 当使用 rpathrunpath 时,要确保指定的路径是可靠和安全的。
  • 如果共享库的位置在部署后可能会发生变化,过度依赖这些选项可能会导致以后的维护问题。
  • 一些系统可能配置有安全机制,比如 SELinux,这可能会限制应用程序只能从特定的目录加载共享库。

在决定使用 rpathrunpath 还是 LD_LIBRARY_PATH 时,需要根据应用程序的具体需求和部署环境来权衡。尽可能使用标准路径或者系统包管理器来管理共享库,这样可以最小化环境设置对应用程序正常运行的影响。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

瑞_23种设计模式_外观模式

文章目录 1 外观模式(Facade Pattern)1.1 介绍1.2 概述1.3 外观模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 jdk源码解析 🙊 前言:本文章为瑞_系列专栏之《23种设计模式》的外观模式篇。本文中的部分…

【Vuforia+Unity】AR02-长方体物体识别(Multi Targets)

1.创建模型 选择多维长方体图,这个长方体是生活中的真实物体的拍摄图,提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId=0ddbb5c17e7f4bf090834650bbea4995&av=false 设置长宽高,这个长宽高需要…

学算法要读《算法导论》吗?

大家好,我是 方圆。这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间,也为了给经典的“黑皮书”祛魅,我觉得这些书籍在大部分互联网从业者心中已经不再是…

数组与指针相关

二级指针与指针数组 #include <stdio.h> #include <stdlib.h> int main() { // 定义一个指针数组&#xff0c;每个元素都是一个指向int的指针 int *ptr_array[3]; // 为指针数组的每个元素分配内存 ptr_array[0] malloc(2*sizeof(int)); ptr_array[1] m…

USB Micro引脚及相应原理图绘制

前言&#xff1a;博主为实现绘制USB Micro输入口原理图&#xff0c;首先在 GD32F103XX的数据手册中找到引脚的功能描述&#xff0c;找到USBDM与USBDP功能&#xff0c;分别为引脚PA11与引脚PA12。然后进行相应的原理图绘制。 * USBDM。USBDM 引脚是与通用串行总线 (Universal Se…

20210505-20240223 CSDN 1024天 创作纪念日

作为一个小白&#xff0c;我没想到自己在不知不觉间就走过了如此长久的一段旅程。恍然间&#xff0c;三年多的时光已经过去了。 机缘 我首次写博客是为了记录日常&#xff0c;分享生活。 在这1024天里&#xff0c;我做了一些记录和分享&#xff0c;特别是遇到一些有趣的、值得…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月&#xff0c;我都在忙着构建我的第一开源项目 HexoPress&#xff0c;这个项目是使用 Electron Vue 3 TypeScript 等技术实现的&#xff0c;一方面&#xff0c;我真的很需要一款合自己心意的博客编辑器&#xff0c;另一方面&#xff0c;我也是真心想学习 Electron …

面试经典150题【11-20】

文章目录 面试经典150题【11-20】388.O(1) 时间插入、删除和获取随机元素238.除自身以外数组的乘积134加油站135.分发糖果42. 接雨水13.罗马数字12.整数 转 罗马数字58.最后一个单词的长度14.最长公共前缀151.反转字符串中的单词 面试经典150题【11-20】 388.O(1) 时间插入、删…

[今天跟AI聊聊职场] ~你能接受你的直接领导能力不如你,年纪还比你小很多吗?

知乎问题&#xff1a; 弟弟今年35岁&#xff0c;刚换了一份工作&#xff0c;直接领导小A比他小5岁&#xff0c;各方面经验没有他成熟。难的工作都是弟弟在做&#xff0c;功劳都被直接领导小A抢走了&#xff0c;有时候还要被直接领导小A打压。弟弟感觉升职加薪无望。现在找工作不…

Movelt使用笔记-Movelt Setup Assistant

目录 Setup Assistant配置1 Start 加载urdf模型3 Virtual joints 虚拟关节5 Robot Poses 机器人位姿7 Passive Joints 被动关节8 Controllers 控制器9 Simulation 仿真10 3D Perception 3D感知11 Author Information 作者信息12 Configuration Files 配置文件启动MoveIt!Setup…

Vulnhub-OSCP

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 17:49 CST Nmap scan report for 192.168.1.1 Host is up (0.00052s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168.1.…

深度解析:Integer.parseInt() 源码解读

深度解析&#xff1a;Integer.parseInt() 源码解读 关键要点 解析字符&#xff1a;用于将字符转换为对应的数字值 Character.digit(s.charAt(i),radix) 确定limit&#xff1a;根据正负号分别设定 int limit -Integer.MAX_VALUE;【正】 limit Integer.MIN_VALUE;【负】 负数…

Java基础知识点:入门篇(一)

目录 Java起源第一个Java程序注意点 Java基本语法Java标识符命名规范&#xff08;驼峰命名法&#xff09;注意点 Java修饰符访问控制修饰符privateprotectedpublicdefault 非访问控制修饰符final修饰符abstract修饰符synchronized 修饰符transient 修饰符volatile 修饰符 Java变…

挑战!贪吃蛇小游戏的实现(2)

在贪吃蛇小游戏的实现&#xff08;1&#xff09;中&#xff0c;我们学习了win32 相关的一些知识&#xff0c;本篇文章&#xff0c;博主将带领大家从0开始实现贪吃蛇小游戏&#xff01; 贪吃蛇游戏设计与分析 本地化 <locale.h>实现本地化&#xff0c;该头文件提供的函数…

备战蓝桥杯————二叉树解题思维1

解决二叉树问题时&#xff0c;常采用两种思维模式&#xff1a; 遍历思维模式&#xff1a; 这种思维模式强调是否可以通过一次遍历二叉树来得到答案。通常使用一个遍历函数&#xff08;比如前序、中序、后序遍历&#xff09;结合外部变量来实现。这种方法适用于需要在每个节点上…

如何进行JMeter分布式压测?一个案例教你详细解读!

引言 当前快速发展的互联网应用领域&#xff0c;高效的性能测试已经成为了确保在线应用质量和用户满意度的重要手段之一。 而JMeter分布式压测则是实现这一目标的最佳选择。然而&#xff0c;很多人并不知道如何使用JMeter进行分布式压测&#xff0c;更不知道如何获取准确的测…

前端工程化面试题 | 15.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

物奇ENC算法开关接口修改方法

物奇ENC算法开关接口修改 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙耳机音频&#xff0c;DSP音频项目核心开发资料, 1 配置工具事件接口 2 代…

LeetCode 热题 100 | 二叉树(四)

目录 1 114. 二叉树展开为链表 2 105. 从前序与中序遍历序列构造二叉树 3 437. 路径总和 III 菜鸟做题&#xff08;即将返校版&#xff09;&#xff0c;语言是 C 1 114. 二叉树展开为链表 题眼&#xff1a;展开后的单链表应该与二叉树 先序遍历 顺序相同。 而先序遍历就…