export引发的血案,ldd not found问题分析

来源:互联网 发布:中国武术不堪一击知乎 编辑:程序博客网 时间:2024/06/03 19:30

今天在一台服务器编译程序时的时候报错,

[huaizhi@localhost ~]gcc test.c -o test

/usr/local/libexec/gcc/x86_64-linux-gnu/4.7.1/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory


进一步的分析发现,这个so确实无法链接,not found

[huaizhi@localhost ~]$ ldd /usr/local/libexec/gcc/x86_64-linux-gnu/4.7.1/cc1
        linux-vdso.so.1 =>  (0x00007fff319ff000)
        libmpc.so.3 => not found
        libmpfr.so.4 => not found
        libgmp.so.10 => not found

        libdl.so.2 => /lib64/libdl.so.2 (0x0000003279000000)
        libz.so.1 => /lib64/libz.so.1 (0x0000003279c00000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003279400000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003278c00000)


用ldconfig确认在ld Cache中不存在这个so:

[huaizhi@localhost ~]$ ldconfig  -p|grep libmpc


但是实际上这个so在文件系统中是存在的

[huaizhi@localhost ~]$ locate -r libmpc.so
/usr/local/lib/libmpc.so
/usr/local/lib/libmpc.so.3
/usr/local/lib/libmpc.so.3.0.0


那么有两个方法可以解决这个问题:

方法1:在/etc//etc/ld.so.conf增加动态库路径,并且调用ldconfig更新ld Cache

include ld.so.conf.d/*.conf
/usr/local/lib             #注意此处的格式!!!

在ldconfig生效后,通过ldconfig -p能够找到需要cc1需要动态库,此时gcc可以编译过


方法2:通过$LD_LIBRARY_PATH 增加动态库搜索路径,我在.bash_profile中发现$LD_LIBRARY_PATH 已经添加了路径/usr/local/lib/

[huaizhi@localhost ~]$ echo $LD_LIBRARY_PATH 
/usr/local/lib64:/usr/local/lib:/home/huaizhi/lib:/

那是什么原因呢?


最终发现是由于这个环境变量$LD_LIBRARY_PATH 没有export导致的(可以通过命令 export|grep LD_LIBRARY_PATH来确认一下)

这将导致shell调用gcc的时候无法传递这个环境变量,gcc在调用cc1的时候也就无法完成cc1的动态库链接动作

因此.bash_profile中需要修改为

PATH=$HOME/usr/local/bin:$PATH:$HOME/bin
LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:$HOME/lib:/$LD_LIBRARY_PATH

export PATH
export LD_LIBRARY_PATH

0 0
原创粉丝点击