注意這是在openwrt14.07上編譯click的過程,Linksyswrt1200AC平台見後面,但整個交叉編譯的過程參考此過程。
Openwrt14.07 NETGEAR平台上編譯click:
- 準備openwrt環境
sudoapt-get install build-essential subversion git-core libncurses5-devzlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perlmercurial bzr ecj cvs unzip
下載下傳openwrt版本:gitclone git://git.openwrt.org/14.07/openwrt.git trunk
./scripts/feedsupdate -a //更新擴充
./scripts/feedsinstall -a //安裝擴充
makedefconfig //測試編譯環境
makemenuconfig //編譯固件,進入定制界面
(注意别忘記選擇libraries/ssl/libopenssl,後面的MF會用到)
Notice:配置核心:
TargetSystem–>AtherosAR9XXX //主晶片,cpu型号
TargetProfile–>NETGEARWNDR3800 //路由器型号
選擇Toolchain;
select build SDK
- 指定openwrt的toolchain工具的gcc和g++:
- exportCC=/home/ubuntu/trunk14.07/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc
- exportCXX=/home/ubuntu/trunk14.07/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++
- exportPATH=$PATH:/home/ubuntu/trunk14.07/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/
- exportSTAGING_DIR=/home/ubuntu/trunk14.07/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/
- 下載下傳click源碼:
gitclone git://github.com/kohler/click.git
cdclick
gitcheckout v2.0.1
- 交叉編譯
- ./configure--disable-linuxmodule --enable-local --enable-user-multithread--host=mips-unknown-elf --build=mips--prefix=/home/ubuntu/trunk14.07/trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/--with-linux=/home/ubuntu/trunk14.07/trunk/build_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/linux/
- Make
注意make後接近成功時報如下錯,說明工具click-mkmindriver沒有連結成功,不過這個工具并不影響我們的使用,此時click可執行程式已經在userlevel檔案夾下了,可以直接使用click.(可以在click源碼的tools下删除click-mkmindriver)
- 将MobilityFirst0.1.1源碼中的router相關代碼拷貝到click的elements/local檔案夾下:
- 回到click_2.0.1目錄下,執行步驟4的configure和make步驟。
make步驟會報MF的代碼找不到openssl的相關頭檔案。
因為步驟1中選擇安裝了libopenssl,我們在openwrt目錄下查找檔案:
發現在staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/檔案下。
将此路徑添加到c++和C的頭檔案搜尋路徑:
export CPLUS_INCLUDE_PATH=$ CPLUS_INCLUDE_PATH:/home/ubuntu/trunk14.07/trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/
export C_INCLUDE_PATH=$ C_INCLUDE_PATH:/home/ubuntu/trunk14.07/trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/
重新configure并make:
此時可以看到MF的代碼已編譯通過,在連結動态庫libcrypto時出現問題,找不到庫。
此時查找libcrypto.so的路徑:
将此路徑加入到LDFLAGS,是的ld連結動态庫可以查找到這個檔案路徑:
exportLDFLAGS="-L/home/ubuntu/trunk14.07/trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/"
重新configure并make,成功!
Makeinstall
- 嘗試在SDK裡編譯成ipk,仍然失敗,待分析。
下一步,燒制openwrt,将交叉編譯成功後的MFclick上傳,嘗試運作。
LinksysWRT1200AC
注:下載下傳openwrt15.05的trunk開發版,配置核心如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM0czNwkzM5AjMxUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
編譯openwrt參照上頁,交叉編譯工具的環境變量設定參考上一頁,編譯click+MF步驟參照上頁,./configure修改為如下:
[1]./configure--disable-linuxmodule --enable-local --enable-user-multithread--target=arm-openwrt-linux --host=arm-openwrt-linux--build=i686-linux-gnu--prefix=/home/ubuntu/openwrt/trunk/trunk/staging_dir/toolchain-arm_cortex-a9+vfpv3_gcc-5.2.0_musl-1.1.11_eabi/--with-linux=/home/ubuntu/openwrt/trunk/trunk/build_dir/toolchain-arm_cortex-a9+vfpv3_gcc-5.2.0_musl-1.1.11_eabi/linux/
[2]遇到
在include/click/llrpc.h添加:
//addby jjc
#ifndef_IOC_NRBITS
#define_IOC_NRBITS 8
#endif
#ifndef_IOC_TYPEBITS
#define_IOC_TYPEBITS 8
#endif
#ifndef_IOC_SIZEBITS
#define_IOC_SIZEBITS 14
#endif
#ifndef_IOC_DIRBITS
#define _IOC_DIRBITS 2
#endif
#ifndef _IOC_NRMASK
#define_IOC_NRMASK ((1 << _IOC_NRBITS)-1)
#endif
#ifndef_IOC_TYPEMASK
#define_IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
#endif
#ifndef_IOC_SIZEMASK
#define_IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
#endif
#ifndef_IOC_DIRMASK
#define_IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
#endif
#ifndef_IOC_NRSHIFT
#define_IOC_NRSHIFT 0
#endif
#ifndef_IOC_TYPESHIFT
#define_IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#endif
#ifndef_IOC_SIZESHIFT
#define_IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#endif
#ifndef_IOC_DIRSHIFT
#define_IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
#endif
//endby jjc
進入檔案,注釋掉此頭檔案。
elements/userlevel/todevice.cc也會報這個錯誤,注釋掉此頭檔案。
編譯click-mkmindriver錯誤,進入tools檔案夾,删掉click-mkmindriver(不影響click主體程式)
重新configure、make。成功!
(SDK中也可以feed後安裝相關依賴,然後進行編譯)
Linksys安裝https://wiki.openwrt.org/toh/linksys/wrt1200ac提供的https://downloads.openwrt.org/snapshots/trunk/mvebu/generic/鏡像(和我編譯的一緻,15.07),安裝完畢後,
【1】ssh登陸進去,然後安裝基于Luci的web界面:
opkgupdate
opkginstall luci-ssl
/etc/init.d/uhttpdenable
/etc/init.d/uhttpdstart
然後便可以192.168.1.1登陸網頁管理界面。
【2】開啟ftp服務,用于傳輸檔案
opkginstall vsftpd openssh-sftp-server
/etc/init.d/vsftpdenable
/etc/init.d/vsftpdstart
【3】上傳交叉編譯好的click相關檔案,安裝相關依賴軟體:
opkginstall libopenssl
opkginstall libpcap
opkginstall libstdcpp
ok!