首先編譯iw,
Iw支持兩種加密/認證方式。第一種是OPEN/OPEN 第二種是WEP/WEP
在網上下載iw源碼,發現iw的編譯需要依賴libnl庫(這個庫是為了方便應用程序使用netlink借口而開發的一個庫)什么是netlink:netlink套接字是用以實現用戶進程與內核間進行通信的一種特殊的進程間通信,也是網絡應用程序與內核通信的最常用的借口
在嵌入式軟件開發的過程中,通常需要很多的開源軟件的編譯及其使用,經過了這個久的開發,現在結合這幾個實例談談軟件編譯移植的過程,以及debug的過程
首先查看目錄下是否有configure這個文件,可以得知這個目錄下有這個文件,有這個文件后,在linux下交叉編譯的一個萬能方法就是
./configure -–host=arm-linux --prefix=$PWD/tmp
然后進行make,通常開源軟件都不會一帆風順的編譯過,十分惡心,只能消停的debug,編譯這個libnl出現錯誤
GEN route/pktloc_syntax.c
make all-am
make[2]: Entering directory `/home/wifi/iw/libnl-3.2.23/lib'
CC addr.lo
addr.c:1027: error: 'AF_RDS' undeclared here (not in a function)
addr.c:1033: error: 'AF_CAN' undeclared here (not in a function)
addr.c:1034: error: 'AF_TIPC' undeclared here (not in a function)
addr.c:1038: error: 'AF_ISDN' undeclared here (not in a function)
addr.c:1039: error: 'AF_PHONET' undeclared here (not in a function)
make[2]: *** [addr.lo] 錯誤 1
make[2]: Leaving directory `/home/wifi/iw/libnl-3.2.23/lib'
make[1]: *** [all] 錯誤 2
make[1]: Leaving directory `/home/wifi/iw/libnl-3.2.23/lib'
make: *** [all-recursive] 錯誤 1
可以吧這些錯誤放在Google搜索下
自己看這些錯誤應該就是一些宏沒有被定義,那就自己定義唄
Vim ./lib/addr.c +1027
在哪里能找到這個宏的定義呢?實際上這些頭文件大都來自於內核中,在內核中搜索然后拷貝后發現可以了make
Make install
然后看到當前目錄中的tmp目錄下已經有編譯出來的文件了
etc include lib sbin share
接下來要把include目錄中的頭文件放在交叉編譯鏈的目錄中
cp * -fr /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/
庫文件
cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/
動態的庫文件也需要拷貝到網絡系統的lib目錄下
cp *so* -d /home/S5-driver/lesson8/rootfs/lib/
到這里,這個開源的應用庫就被我們編譯結束了。
解壓.tar.gz文件用xzf
解壓.tar.bz2用xjf
解壓iw進行入目錄,沒有configure文件,那么只能修改makefile
將makefile中的CC改為arm-linux-gcc
出錯:
#如果這個變量被定義了才會定義下面的變量
ifeq ($(NL31FOUND),Y)
CFLAGS += -DCONFIG_LIBNL30
LIBS += -lnl-genl
NLLIBNAME = libnl-3.1
endif
#變量未定義的情況下才會打印這句話,什么時候會被定義,往前看
76:ifeq ($(NLLIBNAME),)
$(error Cannot find development files for any supported version of libnl)
Endif
再往上看下這個宏
其實我們用的libnl的版本是3.11所以只能選擇3.x這項,
NL3xFOUND := $(shell $(PKG_CONFIG) --atleast-version=3.2 libnl-3.0 && echo Y)
而這句話對用的shell語言只能在PC機上運行,不能在開發板上運行,所以直接讓
NL3xFOUND=y
再進行編譯又出現了另外的一些錯誤
找不到頭文件,因為復制的時候
cp * -fr /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/
這個命令應該在./tmp/include/libnl3/目錄下執行
更改后繼續進行編譯
出錯
info.c:493: error: implicit declaration of function 'htole16'
再網上找到這個函數自己定義
#define htole16(x) ((((uint16_t)(x))<<8) | (((uint16_t)(x))>>8)) & 0xffff
再執行make,編譯成功,成功出現iw這個應用程序。將這個程序復制到根文件系統的bin目錄下,這個東西就是個wifi的命令了