最近在学习嵌入式开发,遇到了下面的问题,在查找各种资料并实际检测之后得总结出下面的教程,希望能对嵌入式新手们有一定的帮助。
在RHEL6.4的64位系统上,使用arm-linux-gcc交叉编译器,编译c程序。编译的时候出现如下错误:error while loading shared libraries: libstdc++.so.6: cannotopen shared object file: No such file or directory 当使用gcc编译器编译时能够正常通过。而且,在路径arm-linux-gnueabihf/lib/里面也能找到libstdc++.so.6。查找资料后了解到:交叉编译器所用到的是32位的开发库,而宿主机是64位的系统。要想正常编译32位的程序需要安装32位兼容库。(ubuntu16.04系统版本没有这个问题。其它的ubuntu版本可用下面的命令解决:sudo apt-get install ia32-libs)
安装兼容库需要用到yum。由于手头的redhat并没有注册(rhel是商业软件,正版注册需要付费,自己只是简单学习下并没有用于商业用途,觉得暂时没有必要购买),所以redhat自己的yum没有在线安装的功能。这个时候就需要配置CentOS的yum源。
处理方式有两种。第一种是在配置文件中,直接引用centOS的源,相对来说比较简单。第二种是卸载掉自带的yum,直接下载centos的yum和源。由于我自己不小心删了redhat自己的yum的一些文件,所以我直接采用第二种方法。(至于第一种方法想尝试的可以自行搜索相应的细节)
1、首先卸载掉自带的yum:(前面的#号代表是root用户下执行)
#rpm -qa | grep yum | xargs rpm -e –nodeps
2、下载软件包(这几个包是必须的):此下载的方式用到了wget命令,要是你的系统没有安装这个命令的话,就手动用浏览器到网站下载
#wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm
#wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
#wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpm
#wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-3.2.29-73.el6.centos.noarch.rpm
#wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-37.el6.noarch.rpm
下载软件包的网址:
x86软件包 地址:http://mirrors.163.com/centos/6/os/i386/Packages/
x86_64软件包 地址:http://mirrors.163.com/centos/6/os/x86_64/Packages/
在使用wget命令下载的过程中,可能会报错,出现 404 not find。那就说明是对应的软件包升级了,需要你自己去改对应版本名。那么怎么知道软件包的最新的版本名称呢?直接在浏览器里输入上面的网址,找到相应的软件包,将名字复制过来就行。
3、接下来是安装下载后的软件,使用到rpm命令:
#rpm -ivh Python-iniparse-0.3.1-2.1.el6.noarch.rpm
#rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
上面这两个包的安装应该没有问题,下面这个可能会出错
#rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm
如果安装的时候报错:python-urlgrabber>= 3.9.1-10 is needed by yum-3.2.29-73.el6.centos.noarch
1)、则先卸载旧版的python-urlgrabber,通过以下命令查看已安装的python-urlgrabber的信息:
# rpm -qa|grep python
2)、通过上面的命令找到的旧的版本号是:python-urlgrabber-3.9.1-9.el6.noarch ,卸载:
rpm –e --nodeps python-urlgrabber-3.9.1-9.el6.noarch
(参数—nodeps是不检查依赖,直接卸载。或者说就是强制卸载)
3)、卸载完后再执行前面的安装命令:
#rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm
剩下的两个包要一起安装,并且在最后安装,否则会出现依赖错误
#rpm -ivh yum-3.2.29-73.el6.centos.noarch.rpmyum-plugin-fastestmirror-1.1.30-37.el6.noarch.rpm
(rpm –ql 命令可以查看软件是否安装成功:rpm –ql 对应软件包名称(不加.rpm)
列出一堆文件的就说明安装成功了。)
4、上面的安装完以后,到http://mirrors.163.com的 centos帮助文档中下载CentOS6-Base-163.repo文件,存放到/etc/yum.repos.d中(直接在/etc/yum.repos.d目录里面执行下面的命令)
#wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
5、编辑CentOS6-Base-163.repo文件,将其中的$releasever更改为centos的版本号:
#vim CentOS6-Base-163.repo
下面的是我改好的CentOS6-Base-163.repo文件(我改的是6.8的版本。6.8不一定一直有效的,要是无效的话可以查一下centos6最新的版本是多少)。
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of theclient and the
# update status of each mirror to pick mirrors that areupdated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall backyou can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-6.8 - Base - 163.com
baseurl=http://mirrors.163.com/centos/6.8/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6.8&arch=$basearch&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#released updates
[updates]
name=CentOS-6.8 - Updates - 163.com
baseurl=http://mirrors.163.com/centos/6.8/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6.8&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#additional packages that may be useful
[extras]
name=CentOS-6.8 - Extras - 163.com
baseurl=http://mirrors.163.com/centos/6.8/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6.8&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#additional packages that extend functionality of existingpackages
[centosplus]
name=CentOS-6.8 - Plus - 163.com
baseurl=http://mirrors.163.com/centos/6.8/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6.8&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#contrib - packages by Centos Users
[contrib]
name=CentOS-6.8 - Contrib - 163.com
baseurl=http://mirrors.163.com/centos/6.8/contrib/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=6.8&arch=$basearch&repo=contrib
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
6、修改完后,执行以下命令:
#yum cleanall (清除原有缓存)
#yum makecache (获取yum列表)
等待一定时间后出现下面提示,表示yum更改完成:
Metadata Cache Created
(没有成功的话试着改一下文件里面CentOS的版本号,改成新的)
到此为止,redhat上的yum就能用于在线下载安装软件包了。
7、安装32位兼容库:
#yum installxulrunner.i686
这个命令将安装centos里所有32位运行库。等待挺长一段时间后,安装完成!
此时,交叉编译器就能够正常工作了。
(最后的那个命令,非红帽或CentOS系统的可以试试sudoyum install ia32-libs.i686)