现象:我在源码安装完gcc-c++-5.4.0后使用g++编译文件时出现一下错误。
g++: error trying to exec 'cc1plus': execvp: No such file or directory
原因分析:
报错意思是,g++在执行‘cc1plus’这个文件时出错,没找到。所以我先看下是不是真的没有这个文件,使用以下命令在环境中查找文件
[root@localhost test]# find / -name "cc1plus"
/root/download/gcc-5.4.0/host-x86_64-unknown-linux-gnu/gcc/cc1plus
/root/download/gcc-5.4.0/host-x86_64-unknown-linux-gnu/prev-gcc/cc1plus
/root/download/gcc-5.4.0/host-x86_64-unknown-linux-gnu/stage1-gcc/cc1plus
/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/cc1plus
/usr/local/gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/cc1plus
然后在g++的安装目录下找到了这个文件,我把g++安装在/usr/local/gcc-5.4.0目录下。
思考:有这个文件也报错,说明没有执行权限或者这个文件坏了。g++在编译的时候,实际上时调用的‘cc1plus’这个程序编译,我直接调用这个文件编译我在test目录写的test.cpp文件。
[root@localhost test]# /usr/local/gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/cc1plus test.cpp
/usr/local/gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/cc1plus: error while loading shared libraries: libmpfr.so.1: cannot open shared object file: No such file or directory
ok,原因找到了。‘cc1plus’程序依赖库出问题了。ldd看下依赖库情况。
[root@localhost test]# ldd /usr/local/gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/cc1plus
linux-vdso.so.1 => (0x00007fff343fc000)
libmpc.so.3 => /lib64/libmpc.so.3 (0x00007f1057ae4000)
libmpfr.so.1 => not found
libgmp.so.3 => not found
libdl.so.2 => /lib64/libdl.so.2 (0x00007f10578df000)
libm.so.6 => /lib64/libm.so.6 (0x00007f10575dd000)
libc.so.6 => /lib64/libc.so.6 (0x00007f105721b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1057d19000)
libmpfr.so.4 => /lib64/libmpfr.so.4 (0x00007f1056fc0000)
libgmp.so.10 => /lib64/libgmp.so.10 (0x00007f1056d49000)
发现libmpfr.so.1和libgmp.so.3两个库没链接到。这是我才焕然大悟,我在安装这两个库时,我是安装在/usr/local/目录下,没有添加软连接。(=_=估计是这个原因了)
原因发现了问题就好办了。有多种解决办法
1、可以在/etc/ld.so.conf.d/目录下创建两个文件,mpfr.conf和gmp.conf。里面把这两个库对应的安装路径下的lib目录填进去。然后执行ldconfig就ok了。告诉ldd在链接的时候去哪里找依赖库。
2、最简单的,直接创建软链接。
[root@localhost test]# ln -s /usr/local/mpfr-2.4.2/lib/libmpfr.so.1 /lib64/libmpfr.so.1
[root@localhost test]# ln -s /usr/local/mpfr-2.4.2/lib/libgmp.so.3 /lib64/libgmp.so.3
[root@localhost test]# ldd /usr/local/gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/cc1plus
linux-vdso.so.1 => (0x00007ffce0bfb000)
libmpc.so.3 => /usr/lib64/libmpc.so.3 (0x00007feb3f994000)
libmpfr.so.1 => /usr/lib64/libmpfr.so.1 (0x00007feb3f747000)
libgmp.so.3 => /lib64/libgmp.so.3 (0x00007feb3f4f1000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007feb3f2ed000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007feb3efeb000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007feb3ec29000)
/lib64/ld-linux-x86-64.so.2 (0x00007feb3fbcb000)
libmpfr.so.4 => /usr/lib64/libmpfr.so.4 (0x00007feb3e9ce000)
libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007feb3e757000)
现在查看这个程序的库链接就ok了。
再来编译下test.cpp。
[root@localhost test]# g++ test.cpp
[root@localhost test]# ./a.out
1223
[root@localhost test]#
【思考】遇到报错还是一步一步分析,别像无头苍蝇一样乱撞。。。