Wi-Fi网络学习记录(3):网络工具的交叉编译与移植

成元 2026-03-23 { 教程, 笔记 } [ Linux, Wi-Fi ]

前言

学习Linux驱动的途中不可避免的要使用网络工具,但是目前热门的Linux驱动教程,比如正点原子的,还在使用 iwlist 等老旧工具,于是写下这篇文章记录如何移植一些基础且较新(这里的新是相比于 iwlist 等工具)的网络工具。

值的注意的是,阅读下文之前,建议先配置好Linux网络驱动。如果你是按照正点原子的开发板与USB网卡进行学习的,可以参考下面两个文章:

移植 iw

iw依赖libnl库,因此我们要先移植 libnl。这里建议移植较为新的 libnl ,避免后面编译 iw 时出现版本不兼容的问题

具体的安装方法如下:

# 从libnl仓库拉取源码并转到3.7版本的分支
~$ git clone https://github.com/thom311/libnl
~$ mv libnl libnl-3.7
~$ mkdir libnl
~$ cd libnl-3.7
~/libnl-3.7$ git checkout -b develop libnl3_7_0

# 编译 libnl
# 这里的交叉编译工具链需要根据对应的平台自行更改
# 我对应的平台为 aarch64
~/libnl-3.7$ ./autogen.sh
~/libnl-3.7$ ./configure \                                                                                       
    --host=arm-none-linux-gnueabihf \
    --prefix=$HOME/libnl \
    CC=arm-none-linux-gnueabihf-gcc
~/libnl-3.7$ make -j$(nproc)
~/libnl-3.7$ make install

# 复制编译出来的库到根文件系统下的 /usr/lib/
# 这里也是根据实际情况修改路径
~/libnl-3.7$ cd ~/libnl/
~/libnl$ cp lib/* ../linux/nfs/rootfs/usr/lib/ -rf

然后开始编译 iw。

具体的安装方法如下:

~/libnl$ cd ~

# 获取 iw-6.7 的tarball,然后解压获取源码
~$ wget 'https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git/snapshot/iw-6.7.tar.gz'
~$ tar -vxf iw-6.7.tar.gz
~$ cd iw-6.7

# 开始编译
# 这里全局环境变量中的路径也要根据实际情况修改
~/iw-6.7$ export PKG_CONFIG_PATH=$HOME/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
~/iw-6.7$ make CC=arm-none-linux-gnueabihf-gcc -j$(nproc)

# 如果你选择的libnl和iw版本与我的不一样,编译过程可能会中产生如下的错误
# implicit declaration of function ‘nla_put_s32’
# 这个是一般是你的 libnl 版本过低了,建议安装较新的 libnl

# 复制编译出的 iw 工具到根文件系统下的 /usr/bin/
~/iw-6.7$ cp iw ../linux/nfs/rootfs/usr/bin/

最后可以使用 ip link set wlan0 up 或者 ifconfig wlan0 up 开启无线接口,然后执行 iw listiw deviw dev wlan0 scan 等命令进行测试。

移植 wpa_supplicant

wpa_supplicant 依赖于 openssl,因此需要先移植 openssl。

具体的安装方法如下:

# 获取 openssl-1.1.1t 的tarball,然后解压获取源码
~$ wget 'https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1t/openssl-1.1.1t.tar.gz'
~$ mkdir openssl
~$ cd openssl-1.1.1t

# 开始编译
~/openssl-1.1.1t$ ./Configure linux-armv4 shared no-asm \
    --prefix=$HOME/openssl \
    CROSS_COMPILE=arm-none-linux-gnueabihf-

~/openssl-1.1.1t$ make -j$(nproc)
~/openssl-1.1.1t$ install

# 复制编译出来的库到根文件系统下的 /usr/lib/
# 这里也是根据实际情况修改路径
~/openssl-1.1.1t$ cd ../openssl/lib
~/openssl$ cp libcrypto.so* ../linux/nfs/rootfs/usr/lib/ -af
~/openssl$ cp libssl.so*  ../linux/nfs/rootfs/usr/lib/ -af

然后编译 wpa_supplicant。

具体的安装方法如下:

~/openssl$ cd ~

# 获取 wpa_supplicant-2.10 的tarball,然后解压获取源码
~$ wget 'https://w1.fi/releases/wpa_supplicant-2.10.tar.gz'
~$ tar -vxf wpa_supplicant-2.10.tar.gz
~$ mkdir wpa_supplicant
~$ cd wpa_supplicant-2.10/wpa_supplicant

# 配置 .config
~/wpa_supplicant-2.10/wpa_supplicant$ cp defconfig .config
~/wpa_supplicant-2.10/wpa_supplicant$ vim .config

vim 需要在 .config 中添加与修改如下的部分:

# 配置交叉编译工具
CC=arm-none-linux-gnueabihf-gcc                                                                                                               
  
# 配置 openssl 的路径
CFLAGS += -I$(HOME)/openssl/include
LIBS += -L$(HOME)/openssl/lib -lssl -lcrypto
  
# 配置 libnl 的路径
CFLAGS += -I$(HOME)/libnl/include/libnl3
LIBS += -L$(HOME)/libnl/lib

# 注释掉下面两行
CONFIG_CTRL_IFACE_DBUS_NEW=y
CONFIG_CTRL_IFACE_DBUS_INTRO=y

配置完成后执行如下的命令即可:

# 开始编译
# 这里全局环境变量中的路径也要根据实际情况修改
~/wpa_supplicant-2.10/wpa_supplicant$ export PKG_CONFIG_PATH=$HOME/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
~/wpa_supplicant-2.10/wpa_supplicant$ make -j$(nproc)

# 复制编译出的 wpa_cli 与 wpa_supplicant 工具到根文件系统下的 /usr/bin/
~/wpa_supplicant-2.10/wpa_supplicant$ cp wpa_cli wpa_supplicant ../linux/nfs/rootfs/usr/bin/

最后可以使用 wpa_supplicant -v等命令进行测试。

总结

总而言之,还是那些老套路,先拉取代码,然后配置.config,最后 make 编译,没有什么很难的地方。成功安装上面提到的工具之后,便能愉快的网上冲浪了。

参考文件