业界动态
openwrt 编译外部源码 过程与问题解决
2024-11-22 08:59

openwrt 是一个编译工具,帮助自定义编译内核和应用(我的理解)。所以如果有定制自己需要的内核,并基于这个定制化内核编译一些应用的话,可以使用openwrt,openwrt 还是很成熟,很方便的。

openwrt 编译外部源码 过程与问题解决

(PS:最开始不知道openwrt的时候,我是自己配置编译环境,然后自己编译应用,当然是很复杂的,又要应用和内核版本一致,又有各种规范,一个OVS编了好久才编好;而使用openwrt ,只需要勾选上自己想要的应用就可以了(openwrt 应用源中的应用很多,基本满足我的需求,所以推荐大家使用openwrt

我使用的openwrt 版本是:19.07.1,想要移植到的平台是:Xilinx ZC702。

        网址是:https://github.com/openwrt/openwrt

                这个不用记,直接谷歌里面输:openwrt github 第一个就是。

        下载:git clone https://github.com.cnpmjs.org/openwrt/openwrt.git .

        你需要使用的源码,放在一个位置。

        .config 配置文件

        这个是说有些库或者软件openwrt 确实没有,那么你可以准备下这些库或者软件的源码,借助 openwrt去帮你编译。

        (PS:当然,你不可能一上来就知道哪个库或者软件openwrt 没有,都是先进入到openwrt 里面,make menuconfig ,找一找,搜一搜,发现确实没有的话,你再去准备下这些东西。

        git tag 看看有哪些版本,我是因为openwrt 对ZC702 的支持从19.07.1 才开始,所以选择这个版本,大家可以根据需求选择版本。

        git checkout 版本号(直接复制git tag给出的某一个版本

        https://blog.csdn.net/sfdgfdvc/article/details/scripts/feeds update -a         #更新feeds软件源

        https://blog.csdn.net/sfdgfdvc/article/details/scripts/feeds install -a        #下载更新

        make menuconfig 

 

        target system 选择目标平台

        target profile 选择具体型号

                这两个是必选项

        然后就是外部源码路径的配置

                

 

        use external kernel tree 按 enter 进入填写路径。

        外部源码配置只需要填下这个路径就行了,没有其他配置项。

        这里我建议,先去外部源码里面预编译一下,然后回来openwrt 走openwrt 的编译流程,因为这里面会涉及到很多问题。

        问题1:配置加载失败

                

 

            出现类似这样的错误,也就是内核的配置有问题,而先把内核源码编译一下就不会出现。

        问题2:make menuconfig 功能和 make kernel_menuconfig CONFIG_TARGET=target 功能的冲突

                这个问题对我来说是这样的:我需要kernel 中的某项功能支持,是cfg80211 模块的子功能,在make kernel_menuconfig CONFIG_TARGET=target(说明:这个是openwrt 下编译内核功能的命令)中已经勾选,但是make 时却提示

                Package kmod-XXX is missing dependencies for the following libraries:

                cfg80211.ko

                mac80211.ko

                所以openwrt 未识别你在kernel 中勾选的功能,因此先编译下内核源码会让你的编译工作更顺畅。

        内核编译

                cd YOUR_KERNEL_PATH        #在你的外部源码路径下操作 

                准备好.config 配置文件

                export ARCH=arm

                export CROSS_COMPILE=arm-linux-gnueabihf-        #没有的话就下载:sudo apt-get install gcc-arm-linux-gnueabihf

                make menuconfig        #确认下你需要的一些功能有没有选上

                make prepare && make modules_prepare

                make -j12 uImage UIMAGE_LOADADDR=0x8000        #这个地方可能有个报错,直接百度下,安装那个工具就好了,具体我忘记了

                make modules

                到此为止,内核预编译工作完成,内核功能已经编好,接下来去openwrt 继续完成openwrt 的编译就好了。

        openwrt 编译

               cd OPENWRT_PATH

               make menuconfig        #确认下配置

               make kernel_menuconfig CONFIG_TARGET=target        #加载下内核配置,并进行确认。这里有个地方需要注意,openwrt 会分一个squashfs 分区,所以你的kernel 配置需要支持这个,进行勾选即可。

 

                然后就是编译

                make download V=s        #这个项我建议无论是第一次还是之后的每一次编译,都先进行这一步。这个命令会下载好你需要编译的软件,提高编译成功率。

                make V=s        #第一次编译时间会稍长一点。

                等待结束即可。

                然后就能烧入 img 镜像,看看能不能跑起来了。

                sz bin/targets/zynq/generic/openwrt-zynq-YourTargerProfile-squashfs-sdcard.img.gz        #具体名称不一样,根据你的平台,但是这个路径。

        以上工作可以满足大部分的需求:内核是根据你的需求定制的;应用也是根据你的需求勾选编译的。img会很小,烧录非常快。

        但是有些情况我们需要的库和软件,openwrt 确实没有提供,怎么办呢?那我们就按照openwrt 的规范,将源码放在要求的位置,稍微改下配置文件,让openwrt 帮助我们完成编译。

        由于我的工作限制,我只编译过库、驱动和应用这些类型,所以后面根据这个分类详细贴出配置文件。

        需要编译第三方的软件(驱动、库等,只需要按照openwrt 的规则,安排好源码的路径结构,稍微改下 makefile 等文件,使openwrt 能够识别你的软件,就可以了,其实还是很简单的。

        一般是这样

                在package/libs(对于库)、package/kernel/(对于驱动)、package/utils(应用软件) 路径下,创建一个文件夹,里面放你的代码,结构如下

                Makefile 和 src/ 

                Makefile 我在后面会根据软件类型不同贴出来。

                src里面就放你的源码。

                src 有些会自带Makefile ,没关系,不需要对它进行修改。比如src/Makefile 里面指定了编译器:CC=gcc,没事啊,外面的Makefile 也会指定openwrt 的编译器,并覆盖内层Makefile 中的配置。

        这些填好后,去make menuconfig 里面勾选上这个软件,就可以开始编译了。

        库

               注意下外层Makefile 就行了

                示例(需要改的地方我已经作了标注

 

        驱动

                驱动的话多一步,在src/ 里面添加一个Kconfig 文件

 

                外层Makefile 示例(需要改的地方我已经作了标注

 

        软件、上层应用

                外层Makefile(需要修改的地方我已经做了批注

 

        编译

                不需要make 全部重新编译,想看看软件编译是否有问题,只需要如此

                make package/libs/库文件夹名/compile

                make package/kernel/驱动文件夹名/compile

                make package/utils/应用文件夹名/compile

                即可单独编译应用。

        这部分其实才是我写这篇文章的原因,在最开始一点都没有接触openwrt 的时候,是这些文章给我指明了方向,现在我已经初步入门,也踩了不少的坑,所以我要像这些文章的作者一样,学习他们的精神,不吝自己的时间与笔墨,将自己的经历和经验写下来,帮助更多的人,少走弯路,更快的编译出自己的固件,享受这份喜悦。

        等到做完这一切回头看的时候,可能觉得也没什么,并不是多难,但是在当初做的时候,那种迷茫与困惑的焦躁心情依然难忘,好多网上的文章都是复制的,根本没用。所以我才自己写文章,试图让一个初学者从头能够学习。

        参考文章

        https://blog.csdn.net/qq_40614144/article/details/105538483

        https://blog.csdn.net/wind0419/article/details/78036522?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

    以上就是本篇文章【openwrt 编译外部源码 过程与问题解决】的全部内容了,欢迎阅览 ! 文章地址:http://sicmodule.glev.cn/news/10399.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 歌乐夫资讯移动站 http://sicmodule.glev.cn/mobile/ , 查看更多   
最新新闻
没有对手的李子柒,迟早会“上链接”?
原创 李觐麟 锌刻度每日一篇科技财经深度调查撰文/ 李觐麟编辑/ 李 季排版/ Annalee“白月光”的杀伤力,在李子柒这里得到了最充
李子柒回归后的真相:三年沉淀,热爱与韧性的完美结合
李子柒,一个曾经红遍网络的名字,因与公司纠纷而停更了整整三年。然而,时隔已久,她的强势归来却丝毫没有被遗忘的迹象,反而激
2025年行业前景分析与发展趋势分析
2025年是乙巳蛇年,许多行业将迎来新的发展机遇和挑战。下面将详细分析2025年的行业前景与发展趋势,介绍不同行业的潜在机会与风
警方通报北电赵韦弦事件:其涉嫌违法犯罪 已被刑拘
警方通报北电赵韦弦事件:其涉嫌违法犯罪 已被刑拘:21日晚,海淀警方通报:针对网传某高校学生赵某某(男,20岁)违法情况,经警
2025年运势简析!
天时地利人和,每年都承载着不同的天时和运势。2025乙巳蛇年,不仅是一个时间标记,更承载着深厚的文化内涵。在中国传统文化中,
创维集成灶400全国统一联保电话《2025汇总》
创维集成灶维修服务24小时热线《2025汇总》(2025已更新)创维集成灶维修服务维修电话:(1)400-9963-901(2)400-9963-901创维集成
离开1217天后,李子柒“熹妃归来”被平台疯抢
停更1217天,李子柒终于回来了。归来仍是顶流11月12日下午4时30分,李子柒在微博、抖音、快手、B站等平台发布了一条以中国非物质
计划2025年12月通车!沁伊高速建设如火如荼
原创 伊川县融媒体中心 伊川新闻伊川县广播电视台 伊川县融媒体中心新闻发布官方平台总监制 郭明杰 监 制 胡幸凡编 审 赵伊曼 制
2025年不一般,2个立春2个六月4人躲春,有啥预兆?要躲几次春?
2025年不一般2025年乃是乙巳蛇年,也就是属蛇的本命年,古书籍当中有提到,十二地支,对应着十二生肖,而十天干,则对应着季节。
热搜第一!李子柒身份证已改名
11月12日,李子柒发布视频官宣回归。李子柒更新道:这个大漆视频迟到了四年,“漆”同“柒”,我给这幅雕漆隐花的漆器作品取名“