动态可执行程序和静态可执行程序
Linux 系统上有两类根本不同的 Linux 可执行程序。
- 第一类是静态链接的可执行程序。它们是“完整的”,静态可执行程序不依赖任何外部库就可以运行。
- 第二类则是动态链接的可执行程序,他们在执行时还需要动态地调用其他库,对其他库存在依赖,这样做的好处就是减小了自己程序的大小。而我们要关注的
ld.so.conf
文件就是一个包含要搜索的动态链接库目录的清单
/etc/ld.so.conf
/etc/ld.so.conf 记录了编译时使用的动态库的路径,也就是加载so库的路径。
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件。而通常通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下,而又没有在文件/etc/ld.so.conf中添加/usr/local/lib这个目录。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。
对于此种情况有2种解决办法:
(1)在用源码安装时,用--prefix指定安装路径为/usr/lib。这样的话也就不用配置PKG_CONFIG_PATH
(2) 直接将路径/usr/local/lib路径加入到etc/ld.so.conf文件中。然后sudo ldconfig
动态装入器找到共享库要依靠两个文件:/etc/ld.so.conf
和/etc/ld.so.cache
ldconfig
/sbin/ldconfig的作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache。
ldconfig是用来管理和更新系统动态链接库的工具,它会根据/etc/ld.so.conf文件中的路径创建软链接,并生成缓存文件/etc/ld.so.cache。
需要运行sudo ldconfig的情况:
1)当安装了新的库文件
2)修改/etc/ld.so.conf,增加了库的新的搜索路径
如果没做,可能会找不到刚安装的库。
默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录。
LD_LIBRARY_PATH 环境变量
若在/lib
和/usr/lib
之外的目录中添加库文件,而又不在/etc/ld.so.conf
中写入路径,此时可以用添加环境变量LD_LIBRARY_PATH
的做法让系统识别到库文件。
同时LD_LIBRARY_PATH
变量可以指示动态装入器首先检查某个目录,可以按照我们希望的优先级进行搜索,多个路径之间用冒号分隔;例如:
export LD_LIBRARY_PATH=/usr/local/lib/:/opt/lib
所有从当前 shell 启动的可执行程序都将使用 /usr/local/lib
或 /opt/lib
中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf
中指定的库。
方法一: 终端上输入以下命令,但是退出当前终端后就失效
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/xxxxx/lib
方法二: vim ~/.bashrc, 添加
export LD_LIBRARY_PATH=/opt/xxxxx/lib:$LD_LIBRARY_PATH
source ~/.bashrc
PKG_CONFIG_PATH 环境变量
pkg-config向configure程序提供系统信息,比如软件的版本、库版本、库的路径等,
这些信息只是在编译其间使用。
ls /usr/local/lib/pkgconfig ,会看到许多的*.pc,
cat /usr/local/lib/pkgconfig/protobuf.pc
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: Protocol Buffers
Description: Google's Data Interchange Format
Version: 3.0.0
Libs: -L${libdir} -lprotobuf -pthread -lpthread
Libs.private:
Cflags: -I${includedir} -pthread
Conflicts: protobuf-lite
configure就是靠这些信息判断你的软件版本是否符合要求。并且得到这些库所在的位置.
不用我说你也知道为什么会出现上面那些问题了吧。
所以要正确配置这个环境变量,我的配置是:
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig
查看执行文件依赖的动态库
ldd test
linux-vdso.so.1 (0x00007ffe8417a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f40101fd000)
libavcodec.so.57 => /usr/lib/x86_64-linux-gnu/libavcodec.so.57 (0x00007f400eadb000)
libavformat.so.57 => /usr/lib/x86_64-linux-gnu/libavformat.so.57 (0x00007f400e680000)
libavutil.so.55 => /usr/lib/x86_64-linux-gnu/libavutil.so.55 (0x00007f400e3f3000)
libopencv_highgui.so.4.5 => /usr/local/lib/libopencv_highgui.so.4.5 (0x00007f400e1dc000)
PATH 环境变量
bin