理解 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
作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题。