1 libopenssl移植
wpa_supplicant 依赖于 libopenssl,因此需要先移植 libopenssl,首先获取openssl-1.1.1-stable-SNAP-20190915.tar.gz压缩包,拷贝到Ubuntu系统下并解压,得到openssl-1.1.1-stable-SNAP-20190915文件夹,然后在新建一个名为“libopenssl”的文件夹,用于存放 libopenssl 的编译结果。进入到解压出来的 openssl-1.1.1-stable-SNAP-20190915 目录中,然后执行如下命令进行配置:
./config shared no-asm --prefix=/home/topeet/tool/libopenssl/
配置成功以后会生成 Makefile,打开 Makefile,找到所有包含“-m64”的内容,一共两处分别为变量 CNF_CFLAGS 和 CNF_CXXFLAGS,将这两个变量中的“-m64”删除掉,修改后如图 1.1所示:
Makefile 修改好以后使用如下命令编译并安装 libopenssl:
make CROSS_COMPILE=arm-linux-gnueabihf- -j4
make install
编译安装完成后在libopenssl目录下有如图 1.2内容:
其中的 lib 目录是我们需要的,将 lib 目录下的所有文件拷贝到开发板根文件系统中的/usr/lib 目录下。当使用U盘拷贝文件是可能会“无法创建符号链接”,这样的文件可以先将lib目录下的文件打包成tar.gz格式的压缩包,然后拷贝到根文件系统下解压到/usr/lib目录下。执行下面的命令:
cd /home/topeet/tool/libopenssl/lib/ //进入lib目录下
tar -czvf lib.tar.gz * //打包当前目录下的文件生成lib.tar.gz
然后通过U盘拷贝到根文件系统下解压到/usr/lib目录下。
mount /dev/sda1 /mnt //挂载U盘到mnt目录下
tar -xvf /mnt/lib.tar.gz -C /usr/lib //直接解压lib.tar.gz到/usr/lib目录下
“-C”指定解压的目录。
2 libnl库移植
wpa_supplicant 也依赖于 libnl,因此还需要移植一下 libnl 库,获取libnl-3.2.23.tar.gz压缩包,然后拷贝到Ubuntu系统下并解压,得到libnl-3.2.23文件夹,然后在新建一个名为“libnl”的文件夹,用于存放 libnl 的编译结果。进入到 libnl-3.2.23 文件夹中,然后执行如下命令进行配置:
./configure --host=arm-linux-gnueabihf --prefix=/home/topeet/tool/libnl/
–host 用于指定交叉编译器的前缀,这里设置为“arm-linux-gnueabihf”,–prefix 用于指定编译结果存放目录,这里要设置为我们刚刚创建的 libnl 文件夹。配置完成以后就可以执行如下命令对 libnl 库进行编译、安装:
make -j12
make install
编译安装完成后的libnl目录下如图 2.1所示:
需要用到libnl文件下的lib库文件,通过U盘拷贝lib下的库文件到/usr/lib目录下。
3 wpa_supplicant 移植
接下来移植wpa_supplicant,获取wpa_supplicant源码包wpa_supplicant-2.7.tar.gz,拷贝到Ubuntu系统下并解压,得到wpa_supplicant-2.7文件夹,进入wpa_supplicant-2.7目录下,有如图 3.1内容:
进入到图中的 wpa_supplicant 目录下,然后进行配置,wpa_supplicant 的配置比较特殊,需要将 wpa_supplicant 下的 defconfig 文件拷贝一份并重命名为.config,命令如下:
cd wpa_supplicant/
cp defconfig .config
完成以后打开.config 文件,在里面指定交叉编译器、openssl、libnl 库和头文件路径,设置如下:
49 CC = arm-linux-gnueabihf-gcc
/* openssl 库文件和头文件路径*/
50 CFLAGS += -I/home/topeet/tool/libopenssl/include
51 LIBS += -L/home/topeet/tool/libopenssl/lib -lssl -lcrypto
52 /*libnl库文件和头文件路径*/
53 CFLAGS += -I/home/topeet/tool/libnl/include/libnl3
54 LIBS += -L/home/topeet/tool/libnl/lib
CC 变量用于指定交叉编译器,这里就是arm-linux-gnueabihf-gcc,CFLAGS 指定需要使用的库头文件路径,LIBS 指定需要用到的库路径。编译 wap_supplicant 的时候需要用到 openssl 和libnl 库,所以在代码中指定了这两个的库路径和头文件路径。上述内容在.config 中的如图 3.2所示:
.config文件修改完成后就可以编译wap_supplicant了,在wap_supplicant目录下使用下列命令编译:
export PKG_CONFIG_PATH=/home/topeet/tool/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
make
首先我们使用 export 指定了 libnl 库的 pkgconfig 路径,环境变量 PKG_CONFIG_PATH 保存着 pkgconfig 包路径。在tool/libnl/lib/下有个名为“pkgconfig”的目录,如图 3.3所示;
编译 wpa_supplicant 的时候是需要指定 libnl 的 pkgconfig 路径,否则会提示“libnl-3.0”或者“libnl-3.0.pc”找不到等错误。编译完成以后就会在本目录下生成 wpa_supplicant 和 wpa_cli这两个命令,如图 3.4所示:
将编译好的wpa_cli 和 wpa_supplicant 这两个文件拷贝到开发板根文件系统的/usr/bin 目录下,拷贝完成后,可以测试一下这两个命令能否使用,在终端下输入下面的命令:
wpa_supplicant -v
上面的命令查看一下 wpa_supplicant 版本号,如果 wpa_supplicant 工作正常的话就会打印出版本号,如图 3.5所示:
可以看出wpa_supplicant 的版本号输出正常,说明 wpa_supplicant 移植成功,接下来就是使用 wpa_supplicant 将开发板的 WIFI 链接到热点上,实现 WIFI 上网功能。