1.问题描述:
最近测试android环境的时候,运行程序,提示以下错误信息:
Cannot run program error=2, 没有那个文件或目录‘ while attempting to get adb.
运行环境是 unbuntu 14.04 64位系统;
2.问题原因:
在网上搜索答案的时候,找到了问题的原因:因为系统是64位的,而Android sdk只有32bit的程序.所以就存在这不兼容的问题,缺少一些sdk运行的库.
3.解决方案:
很多软件只有32位的,还有很多比较依赖32位库,在unbuntu 12.04及以前的版本中都可以直接使用命令:安装ia32-libs库
sudo apt-get install ia32-libs
但是从unbuntu 13.10开始就已经废弃了 ia32-libs,但是我们还是可以使用多构架:打开unbuntu的32位支持功能;
首先,确认是否是一个64构架的内核; 打开终端输入
dpkg --print-architecture
显示的是amd 64 ,说明是64位构架内核
然后,确认是否打开了多构架支持功能;多构架支持功能可以让你在64位库的情况下使用32位库.
在终端输入:
dpkg --print-foreign-architectures
显示的是i386,说明已经打开了多构架支持功能;
显示其他的说明没有打开这个功能,我们就打开多构架支持功能;
在终端输入:
sudo dpkg --add-architecture i386 sudo apt -get update
然后就会下载更新然后运行.
之后再输入:
sudo apt-get dist-upgrade
检查拥有的库文件是否有更新版本.
如果有的话,会提示你是否需要更新(y/n).
这样我们就实现了多构架支持功能.
回到上面我遇到的问题,在打开多构架支持功能之后,我们再安装 lib32z1-dev (编译android需要的文件,参看网上的解答)
在终端中输入:
sudo apt-get install lib32z1-dev
把所有的东西都安装好了之后,再重新运行了一次,发现之前的那个问题好像是解决了,但是又出现了另一个问题:
adb: error while loading shared libraries: libstdc++.so.6: cannot open share
这里好像是缺少了libstdc++.so.6:这个共享库,在网上找到了答案,是缺少lib32stdc++6 这个包,我们直接安装这个包.
sudo apt-get install lib32stdc++6
安装完毕之后,在重新运行一次,发现就没有上面的这两种问题了,说明问题已经解决.
4.问题收获;
在解决这个问题的过程中,在网上查阅了很多资料,在查阅资料的过程中发现了一个很好用的工具 apt-file,
默认情况下unbuntu没有安装这个工具,而且安装这个工具的时候需要root权限.
在终端中输入:
apt-get install apt-file
每次在使用之前都有更新缓存,保证数据是最新的:
apt-file update
这个工具的特点就是:可以根据apt的工作机制,以特定的文件名作为参数来查询该文件会伴随哪些包的安装而在系统中创建.
举个例子,假设在系统安装某些软件失败时提示缺少example.so这个库文件,那么可以执行 (参考于 http://www.guokr.com/blog/749085/)
apt-file search example.so
该命令返回如下信息:
example: /usr/lib/example.so
返回信息表示安装example包会在/usr/lib/目录下创建example.so文件。接下来只需安装example包便可以解决依赖。
apt-get install example
由此可见,这个工具简直就是解决依赖关系的利器啊!