这个问题恶心了我一个小时,明明某一个可执行文件就是存在,但编译用到的时候却说找不到,检查了调用的路径也是对的,[1]中的高赞连接分析了以下可能的原因:
1. 文件不存在,这种一般不会发生
2.dangling symbolic link , 损坏的悬空link
3. 32bit的可执行文件运行在64bit的系统上
4.该文件没有执行权限,所以找不到(added by me)
排查之后是第3个原因
只要你file以下你的文件就可以发现到底是多少位的
file xxxxx
xxxxxx: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV).......
解决方案:
S1. 安装32位的系统架构依赖
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
S2. 安装相应可执行文件缺少的库,例如我缺少zlib1g
sudo apt-get install zlib1g
sudo apt-get install zlib1g:i386
有人会问,我不知道缺什么库,你readelf 以下就可以
readelf -d xxxx
就可以得到类似以下的信息:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libz.so.1]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
。。。。。。。。
reference:
[1]. https://askubuntu.com/questions/133389/no-such-file-or-directory-but-the-file-exists
[2] android - libz.so.1: cannot open shared object file - Stack Overflow