Openwrt本身不支持直接编译C语言的,不支持GCC,因此,我们在Ubuntu下写好的代码,通过gcc编译后的可执行文件是不能直接在openWRT上运行的。
因此,我们需要制作基于openWRT的交叉编译工具 toolchain。
1 搭建开发环境
1.1 openWRT下载
下载Chaos Calmer (15.05)正式发行版
git clone -b chaos_calmer https://github.com/openwrt/openwrt
1.2 openWRT依赖安装
在编译openWRT之前,需要安装依赖,否则会自动停止进入make menuconfig。
一次性安装所需依赖组件,输入:
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev subversion git-core gawk asciidoc libz-dev zlib1g-dev libssl-dev openssl
分步安装如下:
sudo apt-get install g++
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install unzip
sudo apt-get install autoconf
sudo apt-get install gawk
sudo apt-get install make
sudo apt-get install gettext
sudo apt-get install gcc
sudo apt-get install binutils
sudo apt-get install patch
sudo apt-get install bzip2
sudo apt-get install libz-dev
sudo apt-get install asciidoc
sudo apt-get install subversion
sudo apt-get install sphinxsearch
sudo apt-get install libtool
sudo apt-get install sphinx-common
sudo apt-get install openssl (新加的依赖库)
安装完成后需要重启终端
Feeds是OpenWRT环境所需要的软件包套件.比较重要的feeds有:
pacakges’:一些额外的基础路由器特性软件
‘LuCI’:OpenWRT默认的GUI
‘Xwrt’:另一种可选的GUI界面
./scripts/feeds update -a
./scripts/feeds install -a
1.3 openWRT toolchain编译
1.3.1 配置 menuconfig
cd openwrt
make menuconfig
进入下图所示的menuconfig配置界面,进行如下配置:
1、Target System
我手上的路由器CPU芯片是MT7620A,所以配置为 RT288x
2、Subtarget
配置为MT7620
3、Target Profile
配置为MT7620a EVB
4、Package the OpenWrt-based Toolchain
因为我们要制作toolchain交叉编译工具,所以这里通过click 空格键来切换到
“*”为选中状态
1.3.2 编译 Toolchain
配置完成后,保存并退出,然后输入命令编译:
[注意]本次编译过程中需要从国外站点下载所需的依赖文件,因此,编译之前必须挂载VPN来允许访问境外网站,且保证网络稳定,整个编译过程大概为2-4个小时。
make V=s
一切无错的情况下,会在
openwrt源码目录/bin/ramips/
目录下找到编译好的toolchain
- OpenWrt-Toolchain-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
编译交叉编译工具链,有X86和X64之分,根据系统有关系,因此使用现有的toolchain的时候,注意区分系统。
编译成功后如下图所示:
1.3.3 安装 Toolchain
openWRT的交叉编译工具链需要安装到当前系统中,我使用的是Ubuntu 64,然后配置环境变量,才能使用。步骤如下:
1、解压toolchain
将交叉编译工具链解压到Ubuntu的“、opt”目录下,载openWRT的更目录下运行:
sudo tar jxvf ./bin/ramips/OpenWrt-Toolchain-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2 -C /opt/
2、设置环境变量
执行 sudo gedit /etc/bash.bashrc打开文件,在文件最后添加如下配置:
export PATH=/opt/OpenWrt-Toolchain-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin:$PATH
export STAGING_DIR=/~/workspace/openwrt/staging_dir
其中,
export STAGING_DIR配置的是STAGING路径,取决于你openWRT源码的路径。
保存后,执行如下命令:
source /etc/bash.bashrc
3、检查是否安装成功
执行命令:mipsel-openwrt-linux-gcc -v
安装toolchain,如下图所示:
上图中,Error:ld不用管。
1.3.4 Toolchain测试
1、编写hello.c
测试程序:hello.c
源码:
#include
int main(void)
{
unsigned char i = 0;
while(1)
{
printf("\n hello openWRT! %d\n", i);
sleep(1);
}
return 0;
}
2、交叉编译
mipsel-openwrt-linux-gcc hello.c -o hello
生成可执行文件
hello
该可执行文件是试用openWRT的toolchain编译所得,是无法在Ubuntu上直接运行的,需要拷贝到openWRT里运行。
3、通过winSCP放到openWRT
用户名:root
密码:root
4、通过SSH远程登陆后执行
添加X可执行权限:
chmod 777 hello
执行./hello