由来
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
已经存在于你的系统中,但是动态链接器不知道去哪里查找它。要解决这个问题,你可以采取以下几种方式之一:
-
修改
LD_LIBRARY_PATH
环境变量:
你可以临时或永久地修改LD_LIBRARY_PATH
环境变量,使其包含/usr/local/lib
路径。临时修改只需在当前终端会话中执行以下命令:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
永久修改的话,你需要将上述命令添加到你的shell配置文件中,例如
~/.bashrc
或~/.profile
,具体取决于你的Linux发行版和shell类型。 -
更新
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
。 -
创建符号链接:
如果libblis.so.4
位于一个非标准位置,你可以考虑在标准库路径(如/usr/lib
或/usr/lib64
)中创建一个指向它的符号链接。然而,这种方法通常不推荐,因为它可能干扰其他依赖相同库的软件包。 -
重新编译或安装软件包:
如果可能,你可以尝试重新编译或安装llama-cli
,确保在编译时链接器能找到libblis.so.4
。这通常涉及到在编译命令中加入-L/usr/local/lib
来指定库的搜索路径。
完成上述步骤之一后,你应该能够运行./llama-cli
而不遇到共享库找不到的错误。如果问题仍然存在,检查libblis.so.4
的版本是否与llama-cli
所期望的版本匹配,以及是否有权限问题阻止了动态链接器访问该库。