/etc/ld.so.conf详解

参考链接:

https://www.cnblogs.com/chris-cp/p/3591306.html

   

     解释了为什么动态库文件查找不到的问题。

 

 /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文件的中。在文件/etc/ld.so.conf中末尾直接添加:/usr/local/lib(这个方法给力!)

ldconfig
再来看看ldconfig这个程序,位于/sbin下,它的作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新的搜索路径,需要运>行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

PKG_CONFIG_PATH:

最后说下PKG_CONFIG_PATH这个环境变量,它是在安装了pkg-config后出现的
其实pkg-config就是向configure程序提供系统信息的程序,比如软件的版本啦,库的版本啦,库的路径啦,等等
这些信息只是在编译其间使用。你可以 ls /usr/lib/pkgconfig 下,会看到许多的*.pc,用文本编辑器打开
会发现类似下面的信息:
prefix=/usr
exec_prefix=$
libdir=$/lib
includedir=$/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L$ -lglib-2.0
Cflags: -I$/glib-2.0 -I$/glib-2.0/include
明白了吧,configure就是靠这些信息判断你的软件版本是否符合要求。并且得到这些东东所在的位置,要不去哪>里找呀。
不用我说你也知道为什么会出现上面那些问题了吧。
所以要正确配置这个环境变量,我的配置是:
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig

 

 

解决思路:
1. 确定相关 so 库已经在 /usr/lib/ 目录下。
 
2. 确定 CMakeLists.txt 中设置正确。
find_library(OSS_LIBRARY NAMES oss_c_sdk PATHS /usr/lib)find_library(MXML_LIBRARY NAMES mxml PATHS /usr/lib) message(STATUS "oss lib:${OSS_LIBRARY}")message(STATUS "mxml lib:${MXML_LIBRARY}") add_executable(...) target_link_libraries(${PROJECT_NAME} ${OSS_LIBRARY})target_link_libraries(${PROJECT_NAME} ${MXML_LIBRARY})
3. 确定编译通过,生成可执行文件。
[root@a7381ab12e62 build]# cmake ..-- oss lib:/usr/lib/liboss_c_sdk.so-- mxml lib:/usr/lib/libmxml.so-- Configuring done-- Generating done-- Build files have been written to: /usr/src/test/build [root@a7381ab12e62 build]# make[ 20%] ...[ 40%] ...[ 60%] ...[ 80%] ...[100%] Built target oss_demo
4. 执行。
[root@a7381ab12e62 build]# ./oss_demo ./test_demo: error while loading shared libraries: liboss_c_sdk.so.3.0.0: cannot open shared object file: No such file or directory
5.  使用 ldd 命令查看可执行文件需要的 so 库。
[root@a7381ab12e62 build]# ldd oss_demo  linux-vdso.so.1 =>  (0x00007ffe1a7cb000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7a251a0000) liboss_c_sdk.so.3.0.0 => not found libmxml.so.1 => not found        ...
可以看到,oss_c_sdk 和 mxml 的 so 库没有找到。
6. 问题原因。
因为 oss_c_sdk 和 mxml 的 so 库是使用源码方式进行安装的。但是系统的软件包管理器(package manager)并不知道你已经安装了新库,因此使用 ldd 命令时会显示 「not found」。(如果使用 apt-get 或 yum 安装软件时,一般会安装两个包:software 和 software-dev。其中 software-dev 中包含该软件的头文件和其库文件。)
7. 解决问题。
既然系统不知道我已经安装了新的动态库,那么就应该想办法告诉系统。
1. 使用 ldconfig  
 ldconfig creates the necessary links and cache to the most recent shared libraries found in the directories specified on the command line, in the file /etc/ld.so.conf, and in the trusted directories (/lib and /usr/lib).
[root@a7381ab12e62 build]# ldconfig

2. 设置 LD_LIBRARY_PATH
[root@a7381ab12e62 build]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/
3. 修改 /etc/ld.so.conf 文件内容,将相关库的路径添加到 /etc/ld.so.conf 文件中
#文件 /etc/ld.so.conf/usr/lib/
注:如果库文件放在了自定义目录下(非 /usr/lib、/lib),使用 ldconfig 命令没有作用时就使用方法2 和 方法3。
————————————————
版权声明:本文为CSDN博主「大川搬砖」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shizhe0123/article/details/93733802

 

posted @ 2019-12-16 20:25  凌空a  阅读(495)  评论(0编辑  收藏  举报