第一次在Ubuntu上编译OpenWrt时,最让人头疼的往往不是编译过程本身,而是连源码都下载不下来的尴尬情况。官方推荐的git clone命令经常因为网络问题报错,这时候千万别急着放弃。我遇到过太多次这种情况,后来发现改用GitHub镜像源是最稳妥的方案。
具体操作时,先确认系统已经安装了git:
bash复制sudo apt update && sudo apt install git -y
然后执行以下命令替代官方源:
bash复制git clone https://github.com/openwrt/openwrt.git
这个镜像源同步很及时,速度也快得多。如果连GitHub都访问困难,可以尝试在命令前加上代理环境变量(注意这里要符合内容安全要求,不展开具体代理设置)。
下载完成后,记得切换到稳定分支。新手建议用稳定版:
bash复制cd openwrt && git checkout v22.03.5
执行./scripts/feeds update -a时最常见的错误就是RPC failed。这个问题通常是因为git协议被拦截,解决方法很简单 - 把https换成git协议。
打开feeds.conf.default文件:
bash复制vi feeds.conf.default
把所有https开头的行改为git开头,例如:
code复制src-git packages git://github.com/openwrt/packages.git
改完后保存退出,再次运行feeds更新命令就能顺利通过了。
如果遇到SSL证书验证失败的错误,可以临时关闭验证:
bash复制export GIT_SSL_NO_VERIFY=1
./scripts/feeds update -a
不过更推荐永久性解决方案:
bash复制git config --global http.sslverify false
有时候git://协议会被错误转换,这时候需要设置git全局配置:
bash复制git config --global url."https://github.com".insteadOf git://github.com
这个命令会让git自动把git://协议转换成https://,能解决大部分网络问题。
运行make menuconfig时出现"Error opening terminal: linux"错误,主要是因为终端环境变量设置有问题。先检查当前终端设置:
bash复制echo $TERM
echo $TERMINFO
如果输出不正常,执行:
bash复制export TERM=vt100
export TERMINFO=/usr/share/terminfo
然后确认ncurses库是否安装:
bash复制dpkg -l | grep ncurses
如果缺少相关包,安装完整开发环境:
bash复制sudo apt install libncurses5-dev libncursesw5-dev
OpenWrt编译对GCC版本有严格要求,Ubuntu默认安装的版本可能不够新。检查当前GCC版本:
bash复制gcc --version
如果低于6.0,需要安装新版。推荐使用gcc-10:
bash复制sudo apt install gcc-10 g++-10
设置默认版本:
bash复制sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100
OpenWrt需要Python 3.6+版本。检查Python版本:
bash复制python3 --version
如果版本过低,安装新版:
bash复制sudo apt install python3.8
设置默认Python3:
bash复制sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
编译到最后阶段报错提示缺少GLIBCXX_3.4.26,这是因为libstdc++.so.6版本过低。首先检查当前支持的版本:
bash复制strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
查找系统中已有的新版库文件:
bash复制sudo find / -name libstdc++.so.6*
找到最新版本后(比如/usr/local/lib64/libstdc++.so.6.0.20),执行以下操作:
bash复制sudo cp /usr/local/lib64/libstdc++.so.6.0.20 /usr/lib/x86_64-linux-gnu/
sudo rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
编译成功但没有生成目标固件文件,通常是因为固件体积超过了设备flash容量。查看编译日志,找到类似这样的错误:
code复制[mktplinkfw] *** error: images are too big by 758862 bytes
解决方法是在设备配置文件中修改flash大小。以TP-Link WR841N v9为例:
bash复制vi target/linux/ath79/image/tiny-tp-link.mk
找到对应型号,将4改成16(单位是MB):
code复制define Device/tplink_tl-wr841-v9
$(Device/tplink-4mlzma)
DEVICE_MODEL := TL-WR841N
DEVICE_VARIANT := v9
DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
TPLINK_HWID := 0x08410009
IMAGE_SIZE := 16m
endef
修改后重新编译即可。
为了加快编译速度,可以使用-j参数并行编译。但要注意根据CPU核心数合理设置:
bash复制make -j$(nproc) V=s
如果编译过程中出现奇怪错误,可以先尝试单线程编译:
bash复制make -j1 V=s
这样可以更容易定位问题所在。