debian9上的openwrt创建自己的IPK软件
debian9上的openwrt创建自己的IPK软件
- # debian9上的openwrt创建自己的IPK软件
- 一、生成OpenWRT SDK
- 二、安装openwrt sdk
- 三、创建helloworld项目
- 四、创建helloworld包
- 五、验证helloworld*.ipk
# debian9上的openwrt创建自己的IPK软件
本文主要介绍基于debian9平台的openwrt打包创建自己的ipk,并且能在路由器中运行。
自己在实践中,也遇到了更多的坑,后面都一一解决。可能在不同版本的操作系统,不同版本的openwrt可能都有一些意料之外的坑等着大家,不过不用担心,一切问题找度娘,实在不行问谷哥,问题总能解决。
一、生成OpenWRT SDK
使用非root用户登录到~/openwrt根目录
$ cd /usr/myopenwrt/openwrt/
$ make menuconfig
根据自己的机型选择Target System、Subtarget以及Target Profile后,选中图中的Build the OpenWrt SDK(前面打星号)
保存退出后,开始编译
$ make V=99
如无意外,510分钟即可编译完成,在/openwrt/bin/targets/ramips/mt76x8目录下生成xz格式的压缩文件
openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz
该文件即为openwrt sdk,可以用来编译ipk软件包
二、安装openwrt sdk
复制上面编译后的文件到其他目录下,如myopenwrt/SDK下,使用xz压缩工具解压缩,改个短名。
$ sudo cp bin/targets/ramips/mt76x8/openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz /usr/myopenwrt/SDK/
$ sudo xz -d openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar.xz
$ sudo tar -xvf openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64.tar
$ sudo mv openwrt-sdk-ramips-mt76x8_gcc-7.3.0_musl.Linux-x86_64 openwrt-sdk
坑点1:第一次遇到xz压缩格式,还以为生成sdk出错了,有点懵逼,查了下才知道怎么回事,怒装xz-utils工具
$ sudo aptitude install xz-utils
解压xz文件后,变成tar文件,再用tar解压一次。有资料说tar可以直接解压xz文件,试过了debian下好像不行。
现在sdk的目录就是~/usr/myopenwrt/SDK/openwrt-sdk
参考文档里面说该目录结构与原openwrt结构差不多,然后就往下走进入正题了。注意,这里就是坑点2,可能与编译环境有关。比较一下该目录结构与openwrt目录结构会发现,sdk目录下没有key-built文件夹。还好这个坑点比较容易发现,编译ipk出错,提示找不到这个文件夹,直接copy过来就ok。不放心的话,可以空程序编译一下试试:make V=s,就不会出现下面的错误了。
三、创建helloworld项目
终于进入正题了,直接照搬参考链接里面的步骤,然后后面的Makefile文件直接换成正确的内容,感谢原作者填坑
其实,这里可以是任意我们想要加入的程序,库等。这里就以helloword为例。
在任意路径下,创建helloword项目。比如这里还是在 ~/Workspace/OpenWRT 目录下。
$ cd ~/Workspace/OpenWRT $ mkdir helloword $ cd helloword $ touch helloword.c Makefile
在 ~/Workspace/OpenWRT/ 目录下创建了 helloword 目录,并生成 helloword.c与Makefile文件。
如下为 helloworld.c的内容:
#include <stdio.h>int main() {printf("This is my hello word!\n");return 0; }
Makefile的内容:
helloworld : helloworld.o$(CC) $(LDFLAGS) helloworld.o -o helloworldhelloworld.o : helloworld.c$(CC) $(CFLAGS) -c helloworld.cclean :rm *.o helloworld
首先,确保在程序没问题,在本地能正常编过。为了检验一下,可以就地 make 一下,看程序本身有没有问题。
这个程序都如些之简单了,本人自己了make了一下,OK,再run了一下,正常。
四、创建helloworld包
进入 OpenWrt/Packages/ 并在该目录下创建 helloworld 目录,并进入该目录。
$ cd ~/Workspace/OpenWrt/OpenWrt-SDK/package $ mkdir helloworld $ cd helloworld
将我们第三步写的程序复制到这个目录下来,更名为src。再新建一个 Makefile 文件。
$ cp -r ../../../helloworld src $ touch Makefile
整个过程下来,package目录结构如下:
package |-- helloworld | |-- Makefile | `-- src | |-- helloworld.c | `-- Makefile `-- Makefile
package/Makefile 不要去修改它。
我们要编写的是 package/helloworld/Makefile 这个文件。
在这个文件中,我们要描述 helloworld 包的信息,比如:如何配置、如何编译、如何打包、安装等等信息。
这个文件与一般的 Makefile 格式还不一样,详见OpenWrt上的说明文档:OpenWrt官网Packages说明最终完整的 Makefile 文件如下:
include $(TOPDIR)/rules.mkPKG_NAME:=helloworld PKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/helloworldSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Helloworld -- prints a snarky message endefdefine Package/helloworld/descriptionIt's my first package demo. endefdefine Build/Prepare #已修正echo "Here is Package/Prepare"mkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/ endefdefine Package/helloworld/installecho "Here is Package/install"$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/ endef$(eval $(call BuildPackage,helloworld)) #已去除逗号后面的空格
这次 make -j1 V=s 成功了。生成了 helloworld_1_ar71xx.ipk 。find 一下,看在哪里
好了,这一个步骤,我只能拷贝到这里了,因为这里编译的时候会出现2个坑:
坑点3,在Debian9-64位环境下,git clone最新的openwrt版本情况下,这里可能会出现编译不通过的情况,会出现错误:
Package helloworld is missing dependencies for the following libraries: libc.so.6
解决办法是,修改
openwrt-sdk/staging_dir/target-mipsel_24kc_musl/pkginfo/libc.provides文件,添加libc.so.6到最后一行即可。
坑点4:Makefile文件以及helloworld.c源文件的每行的缩进,不能是空格,空格需要全部删掉,可以用tab代替。这个坑网上一搜一大把,实在是太坑,找了好久才知道是这个问题。
ok,这时候再编译就没有问题了,执行make -j1 V=s,生成了helloworld_1_mipsel_24kc.ipk文件,文件名会根据你的机器硬件不同而不同,不要在意。
$ find -name helloworld*.ipk
./bin/packages/mipsel_24kc/base/helloworld_1_mipsel_24kc.ipk
五、验证helloworld*.ipk
将生成的helloworld_1_mipsel_24kc.ipk文件拷贝到刷了openwrt的路由器上,文件比较小,非常快
$ scp bin/packages/mipsel_24kc/base/helloworld_1_mipsel_24kc.ipk root@192.168.1.1:
root@192.168.1.1's password:
helloworld_1_mipsel_24kc.ipk 100% 1891 92.4KB/s 00:00
ssh登录到路由器,安装helloworld*.ipk,执行helloworld,可以看到成功打印结果。
BusyBox v1.28.4 () built-in shell (ash)_______ ________ __| |.-----.-----.-----.| | | |.----.| |_| - || _ | -__| || | | || _|| _||_______|| __|_____|__|__||________||__| |____||__| W I R E L E S S F R E E D O M-----------------------------------------------------OpenWrt SNAPSHOT, r7394-8722c52b41-----------------------------------------------------
root@OpenWrt:~# ls -l
-rw-r--r-- 1 root root 1891 Jul 11 13:26 helloworld_1_mipsel_24kc.ipk
root@OpenWrt:~# opkg install helloworld_1_mipsel_24kc.ipk
Installing helloworld (1) to root...
Configuring helloworld.
root@OpenWrt:~# helloworld
This is my hello word!
root@OpenWrt:~#
网上虽然有很多人对编译ipk填了很多坑,但是在不同的编译环境下,还是会出现一些意料之外的问题,这时候就需要善于思考和实践了。
debian9上的openwrt创建自己的IPK软件相关推荐
- 《在(虚拟机)ubuntu16.04上进行openwrt环境搭建及源码下载》
广西·河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来之河池学院:OpenWrt无线路由组 写作时间: 2020年7月30日21:00:51 <在(虚拟机)ubun ...
- 如何在Oracle上使用AUTO_INCREMENT创建ID?
本文翻译自:How to create id with AUTO_INCREMENT on Oracle? It appears that there is no concept of AUTO_IN ...
- 如何在Ubuntu上使用MultiSystem创建多启动USB盘
如何在Ubuntu上使用MultiSystem创建多启动USB盘 介绍 也许还有不少人不知道MultiSystem,它是一个用来在Linux系统中创建多启动usb盘的小型的开源软件.使用这个工具,我们 ...
- 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)
通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书) 原文网址:http://www.cnblogs.com/rippleyong/archive/2008/12/15/135541 ...
- Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found...
Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...
- 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...
如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹 09/27/2020 本文内容 本文介绍如何将现有网站上虚拟目录创建.测试和删除到驻留在远程计算机上的文件夹. 适用于: Windows S ...
- ionic xcode 上传appstroe 创建Distribution证书报错 you already have a current iOS Distribution certificate
ionic xcode 上传appstroe 创建Distribution证书报错 you already have a current iOS Distribution certificate 报错 ...
- 在eclipse上使用Maven创建动态web项目
在eclipse上使用Maven创建web工程和使用Maven创建普通Java工程一样,不过在Packaging一栏选择"war",这个过程具体就不多说了,详情见我上一篇文章. 我 ...
- 在win10系统上使用Hyper-v创建虚拟机(win7)并设置文件共享
目录 1.创建虚拟机 2.文件共享[完全在虚拟机中设置] 1.创建虚拟机 百度搜索:在win10系统上使用Hyper-v创建虚拟机(win7) 例如:如何在windows10自带的Hyper-v里创建 ...
- 在AR9331上使用Openwrt
该文章讲解一下在AR9331上使用Openwrt的编译修改方法,前面先介绍一下硬件平台特点,为后面的代码修改做铺垫,然后描述一下Openwrt的编译烧写流程,最后再重点讲述编译配置.代码修改细节. 1 ...
最新文章
- LeetCode 743. Network Delay Time
- python在线教学-微软推出 Python 免费在线教程视频
- Oracle 添加主键和索引
- sql insert 自动增量值_SQL中有关DQL、DML、DDL、DCL的概念与区别
- 腾讯产品面试题 | 如何把剃须刀卖给张飞?
- 【c++面向对象编程】工资管理系统
- 十六、爬虫实战,多线程抓取毛豆新车的数据
- 关于 SAP UI5 对服务器端渲染 Server Sider Render 的支持问题
- 【GIS风暴】GeoJSON数据格式案例全解
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
- 使用友元,编译出错fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) 的解决...
- 最近一周MOSS的link
- vb实现随机生成100个整数,将其中的奇数由大到小排序,偶数由小到大排序,找出其中所有素数并求和
- HTTP请求的TCP瓶颈分析
- 聚焦存储即平台,浪潮存储迎来发展新机遇
- 插槽和axios的封装
- caused by: java.lang.outofmemory_hadoop运行java.lang.OutOfMemoryError:java heap space错误。
- 项目经理如何面对困境
- MAC下PHP开发环境教程
- 关于Co-segmentation