上篇说的是如何刷k3c 的OpenWrt固件,现在来说说交叉编译的事情,也可以百度/Google “OpenWrt交叉编译” 获取更多内容。
不同机型由于CPU架构不同,现有的软件可能满足不了运行要求,目前路由器的主流的是博通的芯片,大多数基于arm/mips。arm也分armv7等等架构,架构、指令集不同,c程序通常无法运行。因为c/c++是对底层架构敏感的,而路由器通常没有编译环境,这时候我们就需要在其他电脑上完成交叉编译。交叉编译,简单来说就是在一个平台上生成另一个平台上的可执行文件。
很多热门路由器,会有很多固件,也有很多编译好的软件集成在openwrt里面,因此没有太大必要自己编译,这里只针对实在找不到对应CPU架构的软件时的情况。
热门机型的SDK在官网有,可以查下自己的CPU架构然后去OpenWrt官网查看。
k3c没有在官方机型里面,不过好在有@paldier维护的SDK,里面有构建所需的工具链,下面以nu-h3c为例,解释如何交叉编译得到可执行文件。以下使用linux(win10 linux子系统也可以)操作
热门机型可以查下自己的CPU架构然后去OpenWrt官网查看,K3C直接下载@paldier的git仓库
git clone https://github.com/paldier/K3C.git
cd K3C/
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
会出现OpenWrt Configuration的图形界面
选择Load->k3c256.config,然后Exit
make #会自动构建依赖、编译固件以及相关模块
完成后Toolchain在K3C/staging_dir/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2。修改环境变量:
vim ~/.bashrc
在末尾加上
export PATH=$PATH:[k3c根目录]/K3C/staging_dir/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin
export STAGING_DIR=[k3c根目录]/K3C/staging_dir/
export CC=mips-openwrt-linux-uclibc-gcc
export GCC=mips-openwrt-linux-uclibc-gcc
其中[k3c根目录]是指K3C文件夹的绝对路径
source ~/.bashrc
这样可以应对大部分没有依赖库的编译工作,比如nu-h3c
git clone cd nu-k3c
make # 即可,Makefile里写的是$(CC),会自动找到[k3c根目录]/K3C/staging_dir/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc 编译器
至此交叉编译就完成了,scp复制文件到路由器上即可执行
如同Debian/RedHat 的包管理工具dpkg/rpm,OpenWrt也使用了一套opkg包管理工具。可以用OpenWrt SDK打包对应平台的程序为.ipk文件。这方面内容我了解也不够深入,只能大致讲一讲如何简单使用OpenWrt SDK。这里以sysuh3c为例,作者@zonyitoo给了完整的使用方法
按照其步骤修改,如果不清楚CPU架构,可以PKGARCHH:=all代替。以刚才的K3C为例:
cd K3C/
git clone [email protected]:zonyitoo/sysuh3c.git -b openwrt package/sysuh3c
vim package/sysuh3c/Makefile #PKGARCHH:=[arch] 改为PKGARCHH:=all
然后更新feed:
cd K3C
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
去到Utilities->选中sysuh3c 然后按M,
退出并保存,然后
make #会构建配置的模块以及固件,所以时间很长,不过它会自己解决依赖问题,比如这个sysuh3c依赖于libc/libgcc/libuci
也可以单独构建sysuh3c,不过就要自己解决依赖问题了
make package/sysuh3c/compile
一般生成的ipk文件在bin/文件夹下,我这里是:
PS:这里的Makefile是给OpenWrt SDK看的,写法与正常Makefile不同,详情请查阅OpenWrt官方文档或者Google。
这次折腾交叉编译h3c主要收获的就是这些,如果说法有问题还请指正,毕竟这块我了解的还是太少。
欢迎去我的博客参观