【参考原文】http://blog.csdn.net/gubenpeiyuan/article/details/7895469
由于要在本地编译程序,在嵌入式系统上运行,因此需要在本地装编译器,目前主要需要mipsel-linux-gcc。之前一直以为可以用apt-get install找到,结果找了好久找不到,发现还是得自己编。
主要是参考上面的那个链接,然后这对自己需求改了改配置。
1. 环境
系统:Ubuntu 16.04
软件: buildroot
该软件可以编译用于 mips, arm等等 的C编译器。
2. 下载
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2
tar -jxvf buildroot-snapshot.tar.bz2
cd buildroot
也可以直接去官网 https://buildroot.org 下载最新的;
注意:解压的buildroot建议放到一个易于管理保存的目录下,因为后续环境变量的指定需要指定到该文件下的内容,因此后续要正常使用交叉编译工具,该文件夹不能删除(当然也可以后续重新拷贝路径,不过文件夹较大会比较麻烦)。
3. 配置buildroot (重要)
make clean
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.
解决办法如下:
CentOS:
yum install -y ncurses-devel
Ubuntu:
sudo apt-get install ncurses-dev
成功编译后会出现选择菜单,先进入Target options,如下图:
选择第一项“Target Architecture”, 根据自己需要的编译环境,配置对应的编译参数,此处改成 MIPS (little endian)
然后返回主界面,选择“Toolchain”, 将"kernel headers"改成自己主机上的Linux版本(及运行改编译器的主机),可以在主机上通过 uname -r 或者 cat /proc/version查看。此处修改为:linux 4.13.x 版本。
当前配置界面向下找到GCC Options,因原生的是只有gcc部分,没有g++部分,需要对编译C++程序,则在菜单里选择 Enable c++选项(按 y 选取)。
——————————————————python编译环境配置(未验证)————————————————————
用于编译python的配置选项
我主要用这个来编译python放在嵌入式设备系统上用,最开始就按照上面的选项,编译一般的程序没问题,编译python会出现:unknow type name 'wchar_t' 错误,这个需要在这里的工具里选几个选项;
a1. 在Toolchain配置项里选择对wchar的支持;
a2. 退出Target options,进入Target packages,在Target packages里再添加几个选项(这里我没看不配置这个会出什么问题,这个里面到底做什么的,我直接按照https://delog.wordpress.com/category/python/ 这个里面的配置弄了)
进入Interpreter lanaguages and scripting 选项,选择python选项,然后吧core python modules里的都选了吧~(编译一次太费时了,缺个什么又得重新编译这个工具链)
配置完了后,保存,并退出。
————————————————————END PYTHON SET—————————————————————————
4. 安装相关库
因为需要联网下载一些文件,因此主机需要联网;
需要提前安装好 bision, flex, texinfo, ncurses等库。
分别做如下安装:
sudo apt-get install texinfo
sudo apt-get install flex
sudo apt-get install bison
(若无法安装,可以手动下载安装,下载网址:http://ftp.gnu.org/gnu/bison/,下载解压后执行./configure完成安装)
sudo apt-get install libncursesn5-dev
(若无法安装,可以手动下载安装,下载网址:http://pkgs.org/search/?keyword=libncurses5-dev,下载后双击点install完成安装)
sudo apt-get install patch
sudo apt-get install gettext
sudo apt-get install g++
5. 编译
最后执行 make -j 编译。
这个编译过程需要几个小时,而且在编译过程中很容易报一个如下错误,并附解决方法:
问题: 在Ubuntu环境中安装软件,报错“virtual memory exhausted: Cannot allocate memory”
提示内存耗尽,这台服务器是1G内存的,可能不够用了。 可以用swap扩展内存, 解决内存耗尽的问题。虚拟内存:虚拟内存是在磁盘上划出一块区域,用来当作内存来使用,弥补内存条不足的一种方法。
因为linux的内存管理机制是只要有剩余物理内存就会一直使用剩余内存直到耗尽,哪怕之前任务分配的内存不需要使用了也不会去回收,在这种情况下,你无论内存开多大,迟早都会耗尽的。当linux内存耗尽后,内核就会kill掉部分线程(主要是当前分配内存的线程)。由于这个原因,我在虚拟机中逐步增加内存到了虚拟机建议的最大内存4G,仍然无法解决问题。后面从网上找到,可以从硬盘虚拟出swap存储区,通过这种方式,就可以尽可能虚拟出一块较大内存,此处我虚拟的是16G,具体方式如下步骤示:
查看内存空间大小:
$ free -m
total used free shared buffers cached
Mem: 993 724 268 0 34 500
Swap: 8703 597 8106
参数-m
表示, 显示的字节单位是m(megabyte)
创建一个 Swap 文件:
dd if=/dev/zero of=swapfile bs=2M count=8192
参数count为swap文件的大小
$ cd /swap
$ sudo dd if=/dev/zero of=swapfile bs=2M count=8192
8192+0 records in
8192+0 records out
17179869184 bytes (17.2 GB) copied, 149.897 s, 57.3 MB/s
把生成的文件转换成SWAP文件
# sudo mkswap swapfile
Setting up swapspace version 1, size = 16777208KiB
no label, UUID=0c6fa11e-3632-4f97-b449-0c4cf2aa5032
激活 Swap 文件
$ sudo swapon swapfile
再次使用 free -m
命令查看内存, 可以看到虚拟内存已经增加了。
使用完毕后可以关掉swap:
$ sudo swapoff swapfile
$ rm -rf /swap
6. 结果
最后的结果在 buildroot/output/host/usr/bin目录下,如下图:
另外,在buildroot/output/target文件夹下,我们发现这就是我们之前选择的Linux版本的busybox!如下图:
我们用file命令查看其中的某个可执行文件,如下:
我们看到,生成的文件确实是MIPS平台的,在我的x86下是无法运行的。
7. 配置环境变量
为了以后方便使用,我们直接将其中的bin文件夹添加到环境变量中,省得我们日后输入长长的路径了。将路径添加到~/.bashrc文件中,输入vim ~/.bashrc,在该文件最后添加如下环境变量,按照格式:export PATH=”$PATH:your path1:your path2 ...”
然后运行source命令:source ~/.bashrc
8. 验证测试
重新打开一个终端,然后在终端下输入交叉编译工具名,查看在shell下是否能正常使用该命令,如下图示:
如图,表明环境变量已设置成功,接下来可以自定义一个测试程序,编译测试效果,测试程序如下:
分别使用linux下的默认编译工具gcc和新安装的交叉编译工具mips64el-linux-gcc编译测试程序并执行,查看效果如下:
至此,在linux下的mips交叉编译环境已经成功安装。。。。。。。。。