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://xiahunao.cn/news/2808167.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式软件分层设计的思想分析

“嵌入式开发&#xff0c;点灯一路发” 那今天我们就以控制LED闪烁为例&#xff0c;来聊聊嵌入式软件分层: ——————————— | | | P1.1 |-----I<|--------------<| | | | P2.1 |-------------/ ---------…

【JavaEE】_synchronized关键字——监视器锁monitor lock

目录 1. synchronized的特性 2. synchronized的使用 3. Java标准库中的线程安全类 1. synchronized的特性 &#xff08;1&#xff09;互斥&#xff1a; 前文已经介绍&#xff0c;某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象&…

Git笔记——4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、操作标签 二、推送标签 三、多人协作一 完成准备工作 协作开发 将内容合并进master 四、多人协作二 协作开发 将内容合并进master 五、解决 git branch -a…

第十二章 Linux——日志管理

第十二章 Linux——日志管理 基本介绍系统常用日志日志管理服务日志轮替基本介绍日志轮替文件命名logrotate配置文件自定义加入日志轮转应用实例 日志轮替机制原理查看内存日志 基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包…

【操作系统】磁盘文件管理系统

实验六 磁盘文件管理的模拟实现 实验目的 文件系统是操作系统中用来存储和管理信息的机构&#xff0c;具有按名存取的功能&#xff0c;不仅能方便用户对信息的使用&#xff0c;也有效提高了信息的安全性。本实验模拟文件系统的目录结构&#xff0c;并在此基础上实现文件的各种…

[c++] 工厂模式 + cyberrt 组件加载器分析

使用对象的时候&#xff0c;可以直接 new 一个&#xff0c;为什么还需要工厂模式 &#xff1f; 工厂模式属于创建型设计模式&#xff0c;将对象的创建和使用进行解耦&#xff0c;对用户隐藏了创建逻辑。 个人感觉上边的表述并没有说清楚为什么需要使用工厂模式。因为使用 new 创…

12个的无时间限制的录屏软件详细比较

您可能尝试过许多录制程序&#xff0c;但大多数都会在30 分钟后停止录制萤幕。如果您需要录制较长的内容&#xff0c;特别是为公司会议或简报进行录制&#xff0c;您将必须找到最好的没有时间限制的录屏软件。这款录音软体可以让您长时间录音而没有任何麻烦。下面列出了12 款无…

亚马逊产品数据抓取

抓取数据 启动抓取 &#xff0c;亚马逊平台前台网站中可以查看、抓取、分析的一系列数据源&#xff0c;其数据种类繁多&#xff0c;本系统主要抓取产品列表&#xff08;包含主图、标题、价格、review分值、prime服务信息等&#xff09;、Listing详情信息&#xff08;包含5点描…

MyBatis---初阶

一、MyBatis作用 是一种更简单的操作和读取数据库的工具。 二、MyBatis准备工作 1、引入依赖 2、配置Mybatis(数据库连接信息) 3、定义接口 Mapper注解是MyBatis中用来标识接口为Mapper接口的注解。在MyBatis中&#xff0c;Mapper接口是用来定义SQL映射的接口&#xff0c;通…

超68万售出,sedo域名登顶最新一期交易排行榜

.com三字母域名售价超过68万人民币&#xff0c;币圈对应的四字母域名近期被曝光售价超过68万人民币。 近日&#xff0c;sedo平台交易信息显示&#xff0c;一个三字母域名被拍卖出10.5万美元&#xff0c;折合人民币超过68万人民币。 据查询&#xff0c;其注册时间为1995年&…

【FreeRTOS】任务创建

参考博客&#xff1a; ESP-IDF FreeRTOS 任务创建分析 - [Genius] - 博客园 (cnblogs.com) 1.什么是任务 1&#xff09;独立的无法返回的函数称为任务 2&#xff09;任务是无线循环 3&#xff09;无返回数据 2.任务的实现过程 1.定义任务栈 裸机程序&#xff1a;统一分配到一…

五种多目标优化算法(MOFA、NSWOA、MOJS、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤&#xff1a; 1. 定义问题&#xff1a;首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数&#xff0c;这些目标函数可能…

软考44-上午题-【数据库】-数据定义语言DDL

一、SQL server数据库的体系结构 SQL server数据库的体系结构是由视图、基本表、存储文件&#xff0c;三级结构组成。 【回顾】&#xff1a;数据库的三级模式结构 视图&#xff1a;外模式 存储文件&#xff1a;内模式 基本表&#xff1a;概念模式 二、SQL语言的分类 SQL语言按…

Yolo v9 “Silence”模块结构及作用!

论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main Silence代码 class Silence(nn.Module):def __init__(self):supe…

2024最新零基础入门|白帽黑客学习教程,从0到黑客高手!

新手如何通过自学黑客技术成为厉害的白帽黑客&#xff1f; 我目前虽然算不上顶尖的白帽大佬&#xff0c;但自己在补天挖漏洞也能搞个1万多块钱。 给大家分享一下我的学习方法&#xff0c;0基础也能上手学习,如果你能坚持学完&#xff0c;你也能成为厉害的白帽子&#xff01; …

Escalate_Linux(4)-利用SUDO实现提权

利用SUDO实现提权 利用用户的sudo授权获得root的shell cat /etc/passwd cat /etc/sudoers 命令没有权限 echo "cat /etc/sudoers" >/tmp/ls chmod 755 /tmp/ls export PATH/tmp:$PATH /home/user5/script 想办法更改user1的口令 echo echo "user1:xiao…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

ubuntu 22.04LTS的一些使用心得

前言 笔者一直在折腾ubuntu作为开发的主力系统&#xff0c;尤其是最近微信和各种软件陆续支持Debian系列&#xff0c;很多软件都可以用了&#xff0c;当然开源的软件大部分是跨平台的&#xff0c;尤其是idea系列。 X11 OR Wayland 关于X11和wayland&#xff0c;笔者还是使用…

CSRF靶场实战

DVWA靶场链接&#xff1a;https://pan.baidu.com/s/1eUlPyB-gjiZwI0wsNW_Vkw?pwd0b52 提取码&#xff1a;0b52 DVWA Low 级别打开靶场&#xff0c;修改密码 复制上面的 url&#xff0c;写个简单的 html 文件 <html <body> <a hrefhttp://127.0.0.1/DVWA/vulne…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…