【linux】理解 export PATH、LIBRARY_PATH、 LD_LIBRARY_PATH

文章详细解释了PATH环境变量如何指示系统查找可执行命令的路径,LIBRARY_PATH在编译期间影响动态链接库的查找,以及LD_LIBRARY_PATH在运行时影响动态库的加载。通过示例展示了当编译或运行程序遇到找不到库文件的问题时,如何通过设置这些环境变量来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解 export PATH、LIBRARY_PATH、 LD_LIBRARY_PATH

1. PATH

PATH 保存可执行文件程序路径,我们命令行中每一句能运行的命令都是系统先通过PATH来找到命令执行文件所在的位置,再运行这个命令。

比如 查看 ifconfig 二进制文件路径:

jacob@ubuntu:~$ locate ifconfig
/usr/sbin/ifconfig

jacob@ubuntu:/usr/sbin$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/cmake-3.25.0-rc1-linux-x86_64/bin

jacob@ubuntu:~$ cd /usr/sbin/

jacob@ubuntu:/usr/sbin$ ll ifconfig 
-rwxr-xr-x 1 root root 87152 Feb  1  2019 ifconfig*

2. LIBRARY_PATH

LIBRARY_PATH 是在程序编译期间查找动态链接库时指定的查找共享库的路径。

比如,编译 create_path 时,报错,原因是找不到编译时需要的动态库libClothoids_linux

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ g++ -o create_path create_path.cpp -lClothoids_linux -ldl -std=c++11
/usr/bin/ld: cannot find -lClothoids_linux
collect2: error: ld returned 1 exit status

解决办法,使用export LIBRARY_PATH指定编译时所需要链接的共享库的路径:

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ export LIBRARY_PATH=$LIBRARY_PATH:/home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/
 
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ g++ -o create_path create_path.cpp -lClothoids_linux -ldl -std=c++11
 
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ echo $LIBRARY_PATH
:/home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ ls
archive  Clothoids  Clothoids.zip  create_path  create_path_build.txt  create_path.cpp  create_path.hpp  euler_spiral_README.pdf
 
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ ldd create_path
	linux-vdso.so.1 (0x00007fff43c62000)
	libClothoids_linux.so => not found  # 编译时链接的动态库在执行时找不到
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7f88697000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7f884b5000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7f88366000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7f8834b000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7f88159000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f7f886b8000)

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ ./create_path  # 可执行文件运行不起来,运行时缺少动态库
./create_path: error while loading shared libraries: libClothoids_linux.so: cannot open shared object file: No such file or directory

3. LD_LIBRARY_PATH

LD_LIBRARY_PATH 环境变量用于在程序运行期间查找动态链接库时,指定除了系统默认路径/usr/lib之外的路径。

比如之前编译好的 create_path 二进制文件,在执行时报错,解决办法为:

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ ./create_path
-2.4208
exit-failure()

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ ldd create_path
	linux-vdso.so.1 (0x00007ffebdffd000)
	libClothoids_linux.so => /home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/libClothoids_linux.so (0x00007fc29238c000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc292377000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc292195000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc292046000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc29202b000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc291e39000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc292516000)

查看 LIBRARY_PATH, LD_LIBRARY_PATH 变量:

jacob@ubuntu:~/Work_DC/PG_EularSpiral$ echo $LD_LIBRARY_PATH
:/home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ 
jacob@ubuntu:~/Work_DC/PG_EularSpiral$ echo $LIBRARY_PATH
:/home/jacob/Work_DC/PG_EularSpiral/Clothoids/build/

4. 相关命令

1. locate

Linux locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。

一般情况我们只需要输入 locate your_file_name 即可查找指定文件

2. ldd

作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题。


%. 参考

  1. Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH和ROS_PACKAGE_PATH

  2. Linux中环境变量PATH,CMAKE_PREFIX_PATH,LIBRARY_PATH与LD_LIBRARY_PATH区别,以及顺序

  3. 2. ldd 查看程序依赖库

  4. Linux locate命令


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值