最近写了很多关于小程序的博客,突然想起在上一家公司的 openwrt 开发经历,什么 WiFi 探针啊,什么串口数据啊,还有4G模块上网啊,当时也想着把所有内容写成博客,还列了十篇博客的大纲,结果就写了一篇,现在快一年过去了,想想自己做过的东西总得留个痕迹吧,现在代码也丢了,只留下一些之前学习的收藏文章,反正也大致写写吧。

编写源码

开发环境是 Windows10下面的 Ubuntu子系统,具体可以看我之前博客。

第一步先创建目录,项目代码要放在 openwrt根目下的 package 目录中,这里源码写在了 hellworld 的 src 目录下,因为外层还有需要编写的文件。

mkdir -p ~/openwrt/package/hellworld/src
cd  ~/openwrt/package/helloworld/src

然后编写 helloworld.c 和源码下的 Makefile 文件

touch helloworld.c Makefile
nano helloworld.c
nano Makefile

helloworld.c 内容如下

#include <stdio.h>
int main()
{printf("hello world!\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 clean 可以清除生成的可执行文件

make
make clean

编写配置文件

这里先进入上一层目录,即 helloworld 目录,并创建一个新的 Makefile 文件

$cd ~/openwrt/package/helloworld
$touch Makefile

接下来编写这个 Makefile 文件,内容如下

include $(TOPDIR)/rules.mk#定义相关信息
PKG_NAME:=helloworld
PKG_RELEASE:=1
PKG_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/Prepareecho "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))

这里别人写的很清楚,我就拿过来用了,也可以参考官方文档。

第1行 include $(TOPDIR)/rules.mk
一般在Makefile的开头,包含了包的基本信息,比如Makefile中的 $(BUILD_DIR), $(INCLUDE_DIR), $(CP), $(INSTALL_DIR), $(INSTALL_BIN)都是这里定义的.具体内容可以到源码主目录下,查看 rules.mk文件.

3~5行,软件包的信息均以“PKG_”开头,其意思和作用如下
PKG_NAME:软件包名称,将在menuconfig和ipkg可以看到。
PKG_VERSION:软件版本号。
PKG_RELEASE:Makefile的版本号
PKG_SOURCE:源代码的文件名。
PKG_SOURCE_URL:源代码的下载网站位置。
PKG_MD5SUM:源代码文件的效验码。用于核对软件包是否下载正确。
PKG_CAT:源代码文件的解压方法。包括zcat, bzcat, unzip等。
PKG_BUILD_DIR:软件包编译目录。它的父目录为$(BUILD_DIR)。

第7行 include $(INCLUDE_DIR)/package.mk
一般在软件包的基本信息完成后再引入,他定义了用户态软件包的规则。编译包分为用户态和内核模块,用户态软件包使用Package,内核模块使用KernelPackage. $(INCLUDE_DIR)/Kernel.mk文件对于软件包为内核时不可缺少, $(INCLUDE_DIR)/package.mk应用在用户态。接下来讲述用户态软件包。用户程序的编译包以 Package/开头,然后接着软件名,在Package定义中的软件名可以与软件包名不一样,而且可以多个定义。

9~13行
定义包的名称为 helloworld
SECTION : 包的类型为 utils
CATEGORY : 目录为Utilitis,即文件在 menuconfig中的位置;有时还会有 SUBMENU项,即子目录.
TITLE : 用于软件包的简短描述,将显示在 menuconfig中.
URL : 软件包的下载位置。
MAINTAINER : 维护者选项。
DEPENDS : 与其他软件的依赖。即如编译或安装需要其他软件时需要说明。如果存在多个依赖,则每个依赖需用空格分开。依赖前使用+号表示默认显示,即对象沒有选中时也会显示,使用@则默认为不显示,即当依赖对象选中后才显示。

15~17行
软件包的详细描述,将显示在 make menuconfig中

19~23行
编译准备方法,对于网上下载的软件包不需要再描述。对于非网上下载或自行开发的软件包必须说明编译准备方法。本文所用的准备方法就是首先创建软件包目录,然后将源码拷贝到刚刚创建的目录中。按OpenWrt的习惯,一般把自己设计的程序全部放在src目录下。

25~29行
软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系统的镜像文件系统目录,因此$(1)表示嵌入系统的镜像目录。
INSTALL_DIR:=install -d -m0755 : 创建所属用戶可读写、执行,其他用戶可读可执行的目录
INSTALL_BIN:=install -m0755 : 编译好的文件到镜像文件目录

31行 $(eval $(call BuildPackage,helloworld))
完成前面定义后,必须使用eval函数实现各种定义。其格式为:
对于一般软件包: $(eval (callPackage,(call Package,(callPackage,(PKG_NAME)))
或对于内核模块: $(eval (callKernelPackage,(call KernelPackage,(callKernelPackage,(PKG_NAME)))
如果一个软件包有多个程序,例如:一个应用程序有自己的内核模块,上面使用的 PKG_NAME需要灵活变通。 eval函数可能设计多个。也可以当成多个软件包处理。

编译软件

这里要回到 openwrt 的主目录编译软件

cd ~/openwrt

在 menu 中选中我们添加的软件

make menuconfig

还记得我们写的配置文件吗?我们定义了软件目录。

define Package/helloworldSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Helloworld -- prints a snarky message
endef

在 openwrt 菜单首页的 Utilities中找到 helloworld,使用空格键勾选上,保存退出。

接下来在 openwrt 的根目录下,单独编译我们的软件

make package/helloworld/compile V=s

应该可以在 openwrt\bin\ramips\ 下的某个目录找到,也可以用下面命令

find bin/ -name "helloworld*.ipk"

软件安装

具体如何使用 SFTP 传文件可以看我上一篇博客,下面讲讲安装软件,下面是一些命令

opkg install xxx.ipkopkg update #更新可以获取的软件包列表
opkg upgrade #对已经安装的软件包升级
opkg list #获取软件列表
opkg install #安装指定的软件包
opkg remove #卸载已经安装的指定的软件包

运行软件

在 openwrt 板子上输入 helloworld并按下回车,应该就会输出我们代码里输出的内容

helloworld
hello world!

openwrt 编写一个helloworld程序相关推荐

  1. 练习1-2:编写一个 JAVA 程序,实现输出考试成绩的前三名。

    1. 考试成绩已保存在数组 scores中,数组元素依次为 89 , -23 , 64 , 91 , 119 , 52 , 73 2. 要求通过自定义方法来实现成绩排名并输出操作,将成绩数组作为参数传 ...

  2. 一、SpringMVC基础入门,创建一个HelloWorld程序

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  3. Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜

    题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...

  4. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数

    试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数 data segment data ends stack segment stack dw 30h dup ...

  5. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来

    试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来 DATA SEGMENT DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUM ...

  6. .java编写一个梯形类lader_能够完成相关计算above为高_【Java】编写一个应用程序计算梯形和圆形的面积...

    说明:这是武汉理工大学计算机学院[Java语言程序设计]课程实验1:编写一个应用程序计算梯形和圆形的面积. 谨记:纸上得来终觉浅,绝知此事要躬行. Java语言程序设计--实验1:类的设计与对象使用 ...

  7. wxWidgets:编写一个应用程序- 使用 WxTextCtrl

    wxWidgets:编写一个应用程序- 使用 WxTextCtrl wxWidgets:编写一个应用程序- 使用 WxTextCtrl wxWidgets:编写一个应用程序- 使用 WxTextCtr ...

  8. wxWidgets:编写一个应用程序

    wxWidgets:编写一个应用程序 wxWidgets:编写一个应用程序 这段代码有什么作用? wxWidgets:编写一个应用程序 您好,欢迎来到本教程.像我一样,您可能尝试过使用 Win32 库 ...

  9. wxWidgets:编写一个应用程序 - 添加一个按钮

    wxWidgets:编写一个应用程序 - 添加一个按钮 wxWidgets:编写一个应用程序 - 添加一个按钮 wxWidgets:编写一个应用程序 - 添加一个按钮 感谢您阅读本教程至少到此为止.在 ...

最新文章

  1. 什么是线程?与进程又有什么区别,为什么要使用它,等对线程进行详细介绍
  2. boost::log::filter用法的测试程序
  3. Boost:bind绑定状态的测试程序
  4. bootstrap -- 一个标签中,同时有 col-xs , col-sm , col-md , col-lg
  5. 数仓dw怎么建_搭建数据仓库的流程简介
  6. oracle处理回车换行符
  7. Android之提示Failed to load WebView provider: No WebView installed
  8. php双引号解析漏洞
  9. 程序员相比于黑客(Hacker),差距有多远?看看程序员怎么说!
  10. Arduino十大滤波算法程序大全(精编无错版)
  11. Flash Player离线安装包下载
  12. 深度linux系统能炒股吗,深度网友支招:Deepin v20下完全可以用炒股票软件
  13. flash builder4.6安装
  14. kettle 创建脚本文件
  15. colorbox iframe小记
  16. Linux常用命令汇总 - 近乎全量命令!
  17. javascript高级编程学习
  18. 三分钟了解http和https
  19. 今日报错系列:没有找到 或上一个增量链接没有生成它;正在执行完全链接
  20. linux对电子信息工程专业的意义,电子信息工程专业的学生应该考哪些必要的资格证书? (1)...

热门文章

  1. Linux查看端口占用情况的命令
  2. 将KITTI数据集的odometry部分velodyne的bin文件转换成rosbag
  3. 美国计算机专业的大学,美国计算机专业什么大学好
  4. 程序员吐槽:四年被三家公司裁员补偿,网友:去BAT转转?
  5. 【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)
  6. 立德教育净利润下滑四成:股价早已“腰斩”,拟并购一所高校
  7. mysql char 50_MySQL中数据类型varchar(50)和char(50)是完全相同的。
  8. SQL Server 数据库中将数据表中的数据转化为Insert 语句
  9. 1T和12T单片机的区别
  10. CortexM3,CortexM4存储器映像