首页 > 其他分享 >LD_LIBRARY_PATH 环境变量

LD_LIBRARY_PATH 环境变量

时间:2024-07-17 15:41:09浏览次数:5  
标签:LD lib LIBRARY usr PATH 链接

由来

LD_LIBRARY_PATH 这个环境变量的名字来源于 Unix 和 Linux 系统中动态链接器(Dynamic Linker)的命名约定,这里的 "LD" 实际上是 "Loader" 的缩写,特指动态链接器。动态链接器负责在程序运行时解析和加载共享库(动态链接库)。

在 Unix 和 Linux 系统中,动态链接器通常是 ld.so,它是系统的一部分,负责处理动态链接和共享库的加载。当一个可执行文件被运行时,动态链接器会读取可执行文件的头部信息,确定需要加载哪些共享库,并将它们链接到运行中的进程地址空间中。

LD_LIBRARY_PATH 的完整含义是 "Loader Library Path" 或者说是 "Dynamic Linker Library Path",它提供了一个机制,允许用户指定除了系统默认搜索路径之外的其他目录,作为动态链接器搜索共享库的附加位置。这样做的目的是为了让用户能够在不需要修改系统配置的情况下,方便地使用位于非标准位置的库文件。

通过设置 LD_LIBRARY_PATH,开发者和系统管理员可以在不改变系统默认配置的情况下,控制动态链接器的行为,从而能够加载特定版本的库,或者加载位于非标准位置的库,这对于测试和部署自定义或第三方库特别有用。然而,由于它能影响到系统中所有使用动态链接器的应用程序,因此在设置时应当谨慎。

用法

LD_LIBRARY_PATH是一个环境变量,用于告诉操作系统的动态链接器在加载共享库时应该额外搜索的目录。在Linux和其他类Unix系统中,当你运行一个需要动态链接库的应用程序时,系统默认会搜索几个预定义的目录(如/lib/usr/lib/usr/local/lib)来查找这些库。

然而,有时库文件可能位于非标准的位置,或者你可能希望优先使用特定版本的库而不是系统默认提供的版本。这时,你就可以通过设置LD_LIBRARY_PATH变量来指示动态链接器去那些非标准目录中查找共享库。

当你设置了LD_LIBRARY_PATH,它应该包含一个冒号分隔的目录列表(在类Unix系统中),其中每个目录都是你希望动态链接器搜索共享库的路径。例如:

export LD_LIBRARY_PATH=/path/to/your/library:/another/path/to/library:$LD_LIBRARY_PATH

在这个例子中,/path/to/your/library/another/path/to/library是两个你想让动态链接器搜索的目录。注意,在设置LD_LIBRARY_PATH时,通常会在最后附加已存在的$LD_LIBRARY_PATH,以保留原有的搜索路径。

需要注意的是,随意修改LD_LIBRARY_PATH可能会导致系统不稳定,因为这可能改变应用程序预期使用的库版本。因此,在生产环境中,使用LD_LIBRARY_PATH应该谨慎,尤其是在服务器或关键系统上。对于临时调试或测试目的,合理使用LD_LIBRARY_PATH是很有帮助的。此外,不要忘记在每次修改LD_LIBRARY_PATH后重启你的应用程序或服务,以便让更改生效。

例题

描述问题:在运行某程序时,遇到如下错误提示:

llama@PC:~/test/llama.cpp$ ./llama-cli -v
./llama-cli: error while loading shared libraries: libblis.so.4: cannot open shared object file: No such file or directory

libblis.so.4安装在目录/usr/local/lib内,如何解决这个错误?

解决问题

遇到“cannot open shared object file”这类错误,通常是因为动态链接器在运行时未能找到所需的共享库。尽管libblis.so.4已经存在于你的系统中,但是动态链接器不知道去哪里查找它。要解决这个问题,你可以采取以下几种方式之一:

  1. 修改LD_LIBRARY_PATH环境变量
    你可以临时或永久地修改LD_LIBRARY_PATH环境变量,使其包含/usr/local/lib路径。临时修改只需在当前终端会话中执行以下命令:

    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    

    永久修改的话,你需要将上述命令添加到你的shell配置文件中,例如~/.bashrc~/.profile,具体取决于你的Linux发行版和shell类型。

  2. 更新ld.so.cache
    另一种方法是更新系统的ld.so.cache,这是一个缓存文件,动态链接器用它来快速定位共享库。首先,确保/usr/local/lib目录已经在/etc/ld.so.conf或其.d子目录中的某个配置文件里被列出。然后,运行以下命令来重建ld.so.cache

    sudo ldconfig
    

    如果/usr/local/lib没有在/etc/ld.so.conf中列出,你可以在那里添加一行:

    echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/local.conf
    

    然后再次运行sudo ldconfig

  3. 创建符号链接
    如果libblis.so.4位于一个非标准位置,你可以考虑在标准库路径(如/usr/lib/usr/lib64)中创建一个指向它的符号链接。然而,这种方法通常不推荐,因为它可能干扰其他依赖相同库的软件包。

  4. 重新编译或安装软件包
    如果可能,你可以尝试重新编译或安装llama-cli,确保在编译时链接器能找到libblis.so.4。这通常涉及到在编译命令中加入-L/usr/local/lib来指定库的搜索路径。

完成上述步骤之一后,你应该能够运行./llama-cli而不遇到共享库找不到的错误。如果问题仍然存在,检查libblis.so.4的版本是否与llama-cli所期望的版本匹配,以及是否有权限问题阻止了动态链接器访问该库。

标签:LD,lib,LIBRARY,usr,PATH,链接
From: https://www.cnblogs.com/litifeng/p/18307560

相关文章

  • search_fields 和 FilterSet
     第一种方法search_fields=['code','name','short_name','org_type','trade_status','address','search']#search字段模糊搜索 第二种方法fromdjango_filters.rest_frameworkimportFi......
  • 三星研究院机试(Optimal Path)
    Mr.KimhastodeliverrefrigeratorstoNcustomers.Fromtheoffice,heisgoingtovisitallthecustomersandthenreturntohishome.Eachlocationoftheoffice,hishome,andthecustomersisgivenintheformofintegercoordinates(x,y)(0≤x≤100,......
  • SciTech-EECS-PCB设计- PCB设计-原理图设计 - Schematic library(原理图元器件库)的设
    原理图绘制的“环境参数设置”设置原理图绘制的“环境参数”步骤大体有:在ad软件主界面菜单,选择“File->New->Project”,在创建工程的窗口,看见一个名称为PCB_Project1.PrjPCB的新工程。按照前面所介绍的“添加原理图”的方法,添加名称为“Sheet1.SchDoc”的“原理图文件”。......
  • 数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、
    全文链接:http://tecdat.cn/?p=27384最近我们被客户要求撰写关于葡萄酒的研究报告,包括一些图形和统计输出。在本文中,数据包含有关葡萄牙“VinhoVerde”葡萄酒的信息介绍该数据集(查看文末了解数据获取方式)有1599个观测值和12个变量,分别是固定酸度、挥发性酸度、柠檬酸、残糖、......
  • sqldumper.exe 是 SQL Server 的一个重要组件,专门用于捕获和处理关键错误,帮助管理员和
     sqldumper.exe的起源可以追溯到MicrosoftSQLServer的开发和运行时管理中。它作为SQLServer的一部分,主要用于处理数据库引擎遇到的关键错误和异常情况。具体来说,sqldumper.exe主要功能包括:异常处理和故障捕获:当SQLServer数据库引擎遇到严重错误时,如内存访问错误......
  • 【YashanDB知识库】存储过程报错snapshot too old
    问题描述20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020snapshottooold的问题,测试也有类似问题。该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。原因分析错误信息收集分析分析存储过程报错日志,核查UN......
  • python中os.stat().st_size、os.path.getsize()获取文件大小
    一、os.stat().st_sizeos.stat(filePath)返回读取指定文件的相关属性,然后利用stat模块进行处理。importosos.stat('data_feather_ys.feather')#os.stat_result(st_mode=33206,st_ino=3659174697257342,st_dev=2829373452,st_nlink=1,st_uid=0,st_gid=0,st_size=400......
  • 报错\corelibrary\think\cache\driver\File.php
    这个错误通常发生在尝试使用 unserialize() 函数反序列化一个存储的缓存数据时,但提供的缓存数据无法被正确解析。在 \core\library\think\cache\driver\File.php 文件的第117行左右,框架尝试从文件中读取缓存数据并反序列化它。以下是一些可能的解决方案:检查缓存文件内容:首......
  • 对AyuWorld的期望 [The Expectation of AyuWorld]
    前言十八个月前我申请了博客空间,但是在今天才正式开始使用。主要有两个原因:第一,我一直在CSDN上面分享自己的学习经验与技术,所以重复的博客空间对于我来说是没有必要的,那时候我不太清楚用这个博客分享什么;第二,博客这个事情被我搁置之后就忘了。因为我现在已经大三了,马上要开启新的......
  • firewalld:管理firewalld防火墙服务
    一,服务启动与停止1,启动:[root@blog~]#systemctlstartfirewalld.service查看状态:[root@blog~]#systemctlstatusfirewalld.service●firewalld.service-firewalld-dynamicfirewalldaemonLoaded:loaded(;;file://blog/usr/lib/systemd/system/firewal......