1.目录说明:
/lib
根目录下的所程序的共享库目录。
此目录下包含系统引导和在根用户执行命令时候所必需用到的共享库。做个不太好但是比较形象的比喻,点类似于Windows上面的system32目录。理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。类似的目录还/usr/lib,/usr/local/lib等等。
/usr/lib
目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件的存放位置。
这个目录功能类似/lib目录,理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。
/lib与/usr/lib:
/lib和/usr/lib的区别类似/bin,/sbin与/usr/bin,/usr/sbin。
/lib一般存放对于用户和系统来说“必须”的库(二进制文件)。
/usr/lib一般存放的只是对用户和系统来说“不是必需的”库(二进制文件)。
2.gcc编译阶段链接库时搜索库文件的顺序
-L选项明文指定的目录
-Wl,rpath指定的目录。此项同1谁的优先级高还没确定,等有时间再验证下。
环境变量LD_LIBRARY_PATH中设置的目录。
/etc/ld.so.cache文件中缓存的文件位置
默认的/usr/lib或者/usr/lib64。
程序运行时搜索动态库文件的顺序:
-Wl,-rpath编译选项指定的目录。
环境变量LD_LIBRARY_PATH中设置的目录。
/etc/ld.so.cache文件中缓存的文件位置。此文件中的数据是一个缓存,来源于/etc/ld.so.conf文件中的内容,执行ldconfig命令后,/etc/ld.so.conf文件中的所有目录下的动态库就会缓存到ld.so.cache文件中。
默认的/usr/lib或者/usr/lib64目录。
做个备注:-Wl,-rpath指定的库文件位置,在编译和运行时都有效。