首先我先介紹下什么是交叉編譯:
交叉編譯,簡(jiǎn)單的說(shuō)就是,就是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行文件,舉個(gè)例子,我我用我的電腦(x86_64平臺(tái))編譯出路由器(mips-AR71XX)上可以執(zhí)行的二進(jìn)制文件,要進(jìn)行交叉編譯首先就要有對(duì)應(yīng)平臺(tái)的編譯器。
Openwrt的交叉編譯并不復(fù)雜。
第一步,你需要得到toolchain(工具鏈),我個(gè)人理解這個(gè)就相當(dāng)于編譯器
如何得到toolchian呢?有兩種方法
1.到openwrt下載(要注意平臺(tái),比如我的路由器是tp-wr703n,所對(duì)應(yīng)的平臺(tái)就是AR71XX,就要到http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/下載 OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2
2.自己編譯,在編譯固件時(shí)可以看到有編譯toolchain的選項(xiàng)(如果不知道我在說(shuō)什么的話,先學(xué)習(xí)下openwrt編譯)
第二步,設(shè)置環(huán)境變量
這里只有兩個(gè)變量需要設(shè)置
1.將工具鏈中的bin文件夾加入PATH
2.添加一個(gè)STAGING_DIR 變量,將其指向放toolchain的文件夾,比如我把toolchain解壓到了/home/yj/openwrt/mips-linux-gcc/下,就把STAGING_DIR 的值賦為/home/yj/openwrt/mips-linux-gcc/
環(huán)境變量的作用及設(shè)置請(qǐng)自行百度,附我的配置(看前兩行)
第三步,進(jìn)行編譯
設(shè)置好環(huán)境變量后,可以檢驗(yàn)一下,在shell中輸入編譯器的前幾部分,看是否可以自動(dòng)補(bǔ)全
接著我們就可以進(jìn)行編譯了
1.編譯單個(gè)文件,就像普通的編譯一樣,只不過(guò)把gcc換成了交叉編譯的編譯器 執(zhí)行 mips-openwrt-linux-uclibc-gcc test.c -o test 得到的test就是路由器上可以執(zhí)行的文件
2.編譯軟件,在./configure 時(shí)加上–host=mips-openwrt-linux-uclibc
以mentohust為例
再執(zhí)行make 命令就可以生成可執(zhí)行文件了
在src文件夾中就可以看到mentohust的可執(zhí)行文件已經(jīng)生成
SDK中其實(shí)是包含toolchain的,SDK就是將編譯好的文件在打包到一個(gè)ipk中,便于安裝。
SDK與toolchain一樣,可以自己編譯也可以從網(wǎng)上下載,不過(guò)我試了下直接下載的使用有問(wèn)題,而自己編譯的可以使用。
SDK生成ipk包時(shí)需要的只是一個(gè)makefile文件,makefile里寫(xiě)了所需下載的文件、生成規(guī)則、軟件版本、類型等。makefile的寫(xiě)法可以到openwrt的官方wiki中找到。
再次以mentohust為例生成ipk包。
mentohust.tar.gz 這是其makefile文件
解壓后的文件夾放到SDK的package文件夾中
然后執(zhí)行 make package/mentohust/compile
這是編譯指定包,編譯package里所有的包的話直接 make就可以了
編譯后,生成ipk包
聯(lián)系客服