LD_LIBRARY_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所期望的版本匹配,以及是否有权限问题阻止了动态链接器访问该库。

posted @ 2024-07-17 15:39  立体风  阅读(3397)  评论(0)    收藏  举报