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软件相关推荐

  1. 《在(虚拟机)ubuntu16.04上进行openwrt环境搭建及源码下载》

    广西·河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来之河池学院:OpenWrt无线路由组 写作时间: 2020年7月30日21:00:51 <在(虚拟机)ubun ...

  2. 如何在Oracle上使用AUTO_INCREMENT创建ID?

    本文翻译自:How to create id with AUTO_INCREMENT on Oracle? It appears that there is no concept of AUTO_IN ...

  3. 如何在Ubuntu上使用MultiSystem创建多启动USB盘

    如何在Ubuntu上使用MultiSystem创建多启动USB盘 介绍 也许还有不少人不知道MultiSystem,它是一个用来在Linux系统中创建多启动usb盘的小型的开源软件.使用这个工具,我们 ...

  4. 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)

    通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书) 原文网址:http://www.cnblogs.com/rippleyong/archive/2008/12/15/135541 ...

  5. Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found...

    Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...

  6. 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...

    如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹 09/27/2020 本文内容 本文介绍如何将现有网站上虚拟目录创建.测试和删除到驻留在远程计算机上的文件夹. 适用于:  Windows S ...

  7. ionic xcode 上传appstroe 创建Distribution证书报错 you already have a current iOS Distribution certificate

    ionic xcode 上传appstroe 创建Distribution证书报错 you already have a current iOS Distribution certificate 报错 ...

  8. 在eclipse上使用Maven创建动态web项目

    在eclipse上使用Maven创建web工程和使用Maven创建普通Java工程一样,不过在Packaging一栏选择"war",这个过程具体就不多说了,详情见我上一篇文章. 我 ...

  9. 在win10系统上使用Hyper-v创建虚拟机(win7)并设置文件共享

    目录 1.创建虚拟机 2.文件共享[完全在虚拟机中设置] 1.创建虚拟机 百度搜索:在win10系统上使用Hyper-v创建虚拟机(win7) 例如:如何在windows10自带的Hyper-v里创建 ...

  10. 在AR9331上使用Openwrt

    该文章讲解一下在AR9331上使用Openwrt的编译修改方法,前面先介绍一下硬件平台特点,为后面的代码修改做铺垫,然后描述一下Openwrt的编译烧写流程,最后再重点讲述编译配置.代码修改细节. 1 ...

最新文章

  1. LeetCode 743. Network Delay Time
  2. python在线教学-微软推出 Python 免费在线教程视频
  3. Oracle 添加主键和索引
  4. sql insert 自动增量值_SQL中有关DQL、DML、DDL、DCL的概念与区别
  5. 腾讯产品面试题 | 如何把剃须刀卖给张飞?
  6. 【c++面向对象编程】工资管理系统
  7. 十六、爬虫实战,多线程抓取毛豆新车的数据
  8. 关于 SAP UI5 对服务器端渲染 Server Sider Render 的支持问题
  9. 【GIS风暴】GeoJSON数据格式案例全解
  10. 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
  11. 使用友元,编译出错fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) 的解决...
  12. 最近一周MOSS的link
  13. vb实现随机生成100个整数,将其中的奇数由大到小排序,偶数由小到大排序,找出其中所有素数并求和
  14. HTTP请求的TCP瓶颈分析
  15. 聚焦存储即平台,浪潮存储迎来发展新机遇
  16. 插槽和axios的封装
  17. caused by: java.lang.outofmemory_hadoop运行java.lang.OutOfMemoryError:java heap space错误。
  18. 项目经理如何面对困境
  19. MAC下PHP开发环境教程
  20. 关于Co-segmentation

热门文章

  1. 最新最全论文合集——CCS 历年最佳论文汇总
  2. 四旋翼自主飞行器探测跟踪系统
  3. 单片机之汇编语言和C语言(以PIC单片机为例)
  4. pic由c语言和汇编语言,单片机教程:PIC单片机C语言程序设计(二)
  5. Centos7远程桌面win7
  6. 信捷PLC远程上下载程序,远程控制
  7. 网络拓扑图:网络拓扑图介绍及在线制作
  8. 飞控中的一些知识点总结
  9. windows下用wget下载数据
  10. 回溯算法符号三角形java_算法设计与分析——符号三角形问题(回溯法)