编译的那点事

由于想利用网络的各种服务器,在网络中做了一台openwrt软路由,里面各种功能插件方便好用。最开始是直接从互联网上下载一些玩家共享的固件,也能比较好地使用,但总感觉有时功能配置不是太合适,或者也有点担心,是不是有后门之类。在学习一段时间后开始了自己编译固件,一年多来经过多次实践,说几点心得体会吧,我是直接用群晖NAS来完成所有工作的。

一、在GitHub上开源的几个主要源码肯定都能编译成功

现在GitHub上有多个固件源,很多个的插件源,从使用过的源码看均能编译成功,过程中可能会有冲突之类,但做一定调整之后能够编译,这说明这些共享本身并没有大的问题。如果编译不能通过主要还是要从自身的系统去找问题。

二、可以采用Docker容器做编译平台,减少了搭建编译平台的复杂性和工作量,中间做文件修改和传递也十分方便。

1、在NAS套件中下载ubuntu20.04官方镜像,用ubuntu20.04镜像建立容器,不做任何额外设置。

2、SSH进入容器后台更换为中科大源并安装编辑工具nano,为ubuntu添加普通用户,并增加sudo权限

sed -i ‘s/archive.ubuntu.com/mirrors.ustc.edu.cn/g’ /etc/apt/sources.list

apt-get update

apt-get upgrade

apt-get install nano

由于编译环境要求不使用root用户编译,所以需要增加一个普通用户

useradd -mk /home/openwrt -s /bin/bash openwrt

passwd openwrt

nano /etc/sudoers

3、将硬盘上一个准备用来保存源码的文件夹映射到上述建立的用户主目录中

三、可以在NAS的管理系统中修改源码配置文件,如feeds.conf.default。

四、按各源码官方说明在容器后台进行编译。

五、第一次无法正常编译,提示各种错误

第一次编译很多人会出现无法正常运行,提示各种错误的问题,这个问题主要来自三方面原因

一是编译平台搭建有问题,就是Linux没有正确的编译环境,解决这个比较简单,就是安装运行源码官方的依赖,确保系统提示都已经安装,没有任何错误,只要提示错误就要全部解决。

二是部分插件之间有冲突

三是编译中各种库文件没有按要求下载到本地,看似下载完成,其实有缺失文件。

1、 不要过多添加其他的源,这样基本可以避免插件冲突问题

2、 make menuconfig中尽量选择默认

3、 正式编译前各步骤要基本没有错误提示,否则重新执行,直到无错误提示。

其中 make -j8 download 下载dl库,非常关键,需要反复执行并确认无误,因为网络关系经常无法完全下载好。

在第一次编译时,不能只看每一步的执行结果,要翻查屏幕中执行显示的反馈信息,如果中间有错误或下载超时等提示,肯定是不能通过的。

总之,没有下载好相关文件是编译不正常的主要原因,在编译过程中要从世界各地服务器下载相关文件,由于网络的原因有些人很难下载到这些必要的文件。

六、部分警告提示可以忽略,一般能够正常编译,似乎警告信息都不会产生严重错误。

很有可能编译成功后,再次进行编译又提示错误,这是因为开始编译后,系统仍然要与各源码网站和库文件通讯,有可能会部分更新一些文件,从而与原有系统产生冲突,如无法调试消除错误,可以删除整个编译文件系统重新下载相关文件后再编译。