今天在一台服务器编译程序时的时候报错,
[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