交叉编译环境的搭建(Linux-2.6.32内核)

时间:2022-02-18 05:10:56

1、创建安装目录

#mkdir /usr/local/arm

如果您的PC 端linux 系统已经有这个文件夹,这步就跳过

2、将交叉编译工具解压到安装目录(注意C是大写)

#tar -xjvf arm-linux-gcc-4.3.2.tar.bz2  -C  /usr/local/arm/

3、修改环境变量

#gedit /etc/bash.bashrc

在最后一行一行加上

PATH=$PATH:/usr/local/arm/arm-linux-gcc-4.3.2/bin

通过gedit编辑器修改防止出错后恢复麻烦

注意该行内容不能写错,否则会很麻烦

若是出现
[root@fei3 src]# vim /etc/profile-bash: vim: command not found

在命令行中输入
#export PATH="/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/bin:/sbin"

4、启用环境变量

#source /etc/bash.bashrc

5、环境验证

#arm-linux-gcc -v

报错:

./arm-linux-gcc: No such file or directory

需要安装32位的兼容环境,方法如下:

#sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

出现版本依赖问题,继续报错:

下列软件包有未满足的依赖关系:
lib32bz2-1.0 : 预依赖: libc6-i386 (>= 2.9-18) 但是它将不会被安装
libc6:i386 : 依赖: libgcc1:i386 但是它将不会被安装
nylas : 依赖: git
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。

解决方案类似:

查看以安装的libc6

root@han-virtual-machine:/etc/apt# dpkg -l | grep libc6
ii libc6:amd64 2.19-0ubuntu69 amd64 GNU C Library: Shared libraries

问题解释:当前系统以安装的 libc6的版本为“2.19-10ubuntu2 “,而我们安装其他软件所依赖的是“2.19-0ubuntu6.9” 。
也就是问题在于,依赖的某个软件的版本,跟系统以安装的版本不一致。但 apt-get又不会自动去卸载以安装的自动安装上依赖的目标版本。所以导致我们需要手动去解决这个问题。当前解决这个问题办法有很多种,我们这里选择了,直接强制覆盖安装目标版本,替代原来系统已安装的版本。

# apt-get install libc6=2.19-0ubuntu6

类似报错还是这样解决:
1.安装时报错软件的依赖关系

2.查看版本

 #dpkg -l | grep libc6

3.制覆盖安装目标版本,替代原来系统已安装的版本

 #apt-get install  libc6=2.19-0ubuntu6

解决了依赖问题,有版本显示则交叉编译环境已经建立了,如下图

root@han-virtual-machine:/Linux-2.6.32# arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)

6、配置内核环境

1.解压Linux-2.6.32

#tar –zxvf Linux-2.6.32.tar.gz –C /

2.配置内核:

#make menuconfig

报错:

HOSTCC scripts/basic/fixdep
scripts/basic/fixdep.c:107:23: error: sys/types.h: No such file or directory
scripts/basic/fixdep.c:108:22: error: sys/stat.h: No such file or directory
make[1]: *** [scripts/basic/fixdep] Error 1
make: *** [scripts_basic] Error 2

解释:ubuntu中并没有所需要的库。所以上面的错误说sys/types.h找不到也是缺少库的原因。

解决方法:

安装lib6-dev

#apt-get install lib6-dev

报错:

The following packages have unmet dependencies:
libc6-dev : Depends: libc6 (= 2.19-0ubuntu6.9) but 2.19-10ubuntu2 is to be installed
E: Unable to correct problems, you have held broken packages.

以上报错的含义是:
libc6-dev: 依赖: libc6的 “ 2.19-0ubuntu6.9”版本, 但是系统已安装的是 “2.19-10ubuntu2” 。
理解了这层意思之后,接下来问题就迎刃而解了。
解决方案同上一样:
查看以安装的libc

root@ubuntu:/etc/apt# dpkg -l | grep libc6
ii libc6:amd64 2.19-10ubuntu.69 amd64 GNU C Library: Shared libraries

问题在于,当前系统以安装的 libc6的版本为“2.19-0ubuntu.69 ” ,而我们安装其他软件(包括build-essential 、g++等)的时候,所依赖的是“2.19-0ubuntu6” 。
也就是问题在于,依赖的某个软件的版本,跟系统以安装的版本不一致。但 apt-get又不会自动去卸载以安装的自动安装上依赖的目标版本。所以导致我们需要手动去解决这个问题。当前解决这个问题办法有很多种,我们这里选择了,直接强制覆盖安装目标版本,替代原来系统已安装的版本。

#apt-get install libc6=2.19-0ubuntu6.9

或者安装build-essential
若是出现依赖文件问题,解决方法跟上面相同,
而我的最终找到替换了libc-dev-bin(被libc6-dev(被build-essential依赖)
依赖)为2.19-0ubuntu6
诶,我这么说你懂了吧!

root@han-virtual-machine:/Linux-2.6.32# apt-get install libc-dev-bin=2.19-0ubuntu6

然后装libc6-dev(被build-essential依赖)

root@han-virtual-machine:/Linux-2.6.32# apt-get install libc6-dev

继续make menuconfig
结果,心态炸了

*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2

问题解释:缺少ncurses这个库,百度了发现是要ncurses-dev这个库。

#apt-get install ncurses-dev

再次make menuconfig,终于

root@han-virtual-machine:/Linux-2.6.32# make menuconfig
scripts/kconfig/mconf arch/arm/Kconfig

交叉编译环境的搭建(Linux-2.6.32内核)

3.编译内核

make一下,等个几分钟,大功告成。

总结:依赖问题

1.良好习惯

安装前
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade # 选项
再开始安装
比较不会碰到套件依赖版本问题

2.查看返回依赖

2-1. 查看 libbz2-1.0:i386 返回依赖于 libc6
sudo apt-rdepends libbz2-1.0:i386 | grep libc6
Depends: libc6 (>= 2.4)
libc6
Depends: libc6 (>= 2.14)


下一篇:
ARM开发板与PC通过NFS 网络文件系统挂接


感谢vickycq、poloshiao指导
求助关于32位库的问题
感谢Daniel Wood
编译Linux内核2.6.35.6实践
感谢duanlove
解决UbuntuServer14.10安装build-essential等软件依赖

                                                                                         *2017.05.18*