1、解压源码包:
tar –xvf wpa_supplicant-2.5.tar.gz
cd wpa_supplicant-2.5/wpa_supplicant
2、配置交叉编译参数:
cp defconfig .config
修改.config文件第17行,添加你交叉编译得到的Openssl库的路径:
CFLAGS += -I/work/IPCAM_LIB/OpensslLib_HI/include
LIBS += -L/work/IPCAM_LIB/OpensslLib_HI/lib -lssl -lcrypto
修改Makefile,指定交叉编译器:
CC=arm-hisiv100nptl-linux-gcc
修改目标文件的路径(默认目标文件路径是/usr/local/目录下,但我们交叉编译生成的目标文件最好自己指定一个路径来存放,方便我们打包制作嵌入式文件系统,同时也不会影响PC机的系统):
export LIBDIR =/work/IPCAM_LIB/Wireless/wpa_supplicant/lib/
export INCDIR =/work/IPCAM_LIB/Wireless/wpa_supplicant/include/
export BINDIR =/work/IPCAM_LIB/Wireless/wpa_supplicant/sbin/
CFLAGS += -I/work/IPCAM_LIB/OpensslLib_HI/include
LIBS += -L/work/IPCAM_LIB/OpensslLib_HI/lib -lssl -lcrypto
3、编译生成目标文件:
make
make install
4、编译过程中遇到的错误及解决办法:
错误1:找不到文件 des.h
../src/crypto/crypto_openssl.c:18:25: 致命错误: openssl/des.h:没有那个文件或目录
编译中断。
make: *** [../src/crypto/crypto_openssl.o] 错误 1
解决办法:
sudo apt-get install libssl-dev
注意:要更新ubuntu的软件源。
错误2: 找不到文件 genl.h
../src/drivers/driver_nl80211.c:17:31: 致命错误: netlink/genl/genl.h:没有那个文件或目录
编译中断。
make: *** [../src/drivers/driver_nl80211.o]错误 1
查看.config文件,知道系统中需要安装libnl工具。
33 #Driver interface for Linux drivers using the nl80211 kernel interface
34#CONFIG_DRIVER_NL80211=y
35
36 #driver_nl80211.c requires libnl. If you are compiling it yourself
37 #you may need to point hostapd to your version of libnl.
38 #
39#CFLAGS += -I$<path to libnl include files>
40#LIBS += -L$<path to libnl library files>
解决办法:
sudo apt-get install libnl-dev
安装libnl-dev后,再次编译就没有上面错误了。
错误3:
CC wpa_passphrase.c
/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/../lib/gcc/arm-hisiv100-linux-uclibcgnueabi/4.4.1/../../../../arm-hisiv100-linux-uclibcgnueabi/bin/ld:cannot find -lcrypto
collect2: ld returned 1 exit status
make: *** [wpa_passphrase] 错误 1
解决办法1:
修改.config文件,去掉wpa_passphrase模块。
CONFIG_NO_WPA_PASSPHRASE=y
解决办法2:添加wpa_passphrase编译时链接Openssl库,如下:
LIBS_p += -L /work/IPCAM_LIB/OpensslLib_HI/lib -lssl -lcrypto
5、注意:编译过程中可能还会遇到其它一些与Openssl裁剪不当相关的错误,比如:
/work/IPCAM_LIB/OpensslLib_HI/lib/libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
../src/crypto/crypto_openssl.o: In function `md4_vector':
/work/Wireless_Drivers/wpa_supplicant-2.5/wpa_supplicant/../src/crypto/crypto_openssl.c:99: undefined reference to `EVP_md4'
collect2: ld returned 1 exit status
make: *** [wpa_supplicant] 错误 1这个是因为在编译裁剪openssl时,使用了no-md4选项去年了MD4加密模块,导致wpa_supplicant在链接时找不到MD4的相关定义。重新编译Openssl时开启MD4就可以了。