首页 > 编程语言 >openwrt 编写一个helloworld程序

openwrt 编写一个helloworld程序

时间:2024-04-08 09:37:21浏览次数:27  
标签:helloworld 编译 PKG 软件包 编写 openwrt DIR

第一步先创建目录,项目代码要放在 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 helloworld

helloworld.o : helloworld.c
    $(CC) $(CFLAGS) -c helloworld.c

clean :
    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.mk

define Package/helloworld
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=Helloworld -- prints a snarky message
endef

define Package/helloworld/description
    It's my first package demo.
endef

define Build/Prepare
    echo "Here is Package/Prepare"
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/helloworld/install
    echo "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 ( c a l l P a c k a g e , (call Package,(callPackage,(PKG_NAME)))
或对于内核模块: $(eval ( c a l l K e r n e l P a c k a g e , (call KernelPackage,(callKernelPackage,(PKG_NAME)))
如果一个软件包有多个程序,例如:一个应用程序有自己的内核模块,上面使用的 PKG_NAME需要灵活变通。 eval函数可能设计多个。也可以当成多个软件包处理。

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

cd ~/openwrt

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

make menuconfig


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

define Package/helloworld
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=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.ipk

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

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

helloworld
hello world!

标签:helloworld,编译,PKG,软件包,编写,openwrt,DIR
From: https://www.cnblogs.com/wang-xiao-shuai/p/18120398

相关文章

  • 数码相框-编写框架
    程序框架程序界面:​程序结构:main.c调用一个T_PageAction​数据类型的Run函数,展示界面。​T_PageAction​类型的结构体。T_PageAction​结构体用于定义页面的行为接口,包含以下成员:.name:字符串,表示页面名称(这里是"main"),用于标识该页面。.Run:函数指针,指向执行页面......
  • 三十六计与代码编写的奇妙结合
    一、引言在编程的世界里,我们总是在寻找更好的方法来解决问题,提高代码的质量和效率。而三十六计,这一中国古代智慧的结晶,竟然与代码编写有着惊人的契合。在这篇博客中,我将带您领略如何利用三十六计的智慧来编写更出色的代码。二、瞒天过海——隐藏复杂性简化接口:为用户提供......
  • GO 语言编写的程序运行过程详解
    1.1go源代码packagemainfuncmain(){goadd(1,2)}funcadd(a,bint)(int,int,int){returna+b,a,b}1234567先来看看上面这段程序的反汇编代码:1.2add函数反汇编代码0x401050  48c744241800000000  MOVQ$0x0,0x18(SP)0x401059  48c744......
  • 【求助】使用flask编写网页时遇到的问题
    @app.route('/signup',methods=['GET','POST'])defsecret():  form3=SecretForm()  ifrequest.method=='POST':    secret=form3.secret.data    ifsecret=='111111':      returnredirect(ur......
  • C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair
    C++Primer(第5版)练习11.14练习11.14扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。环境:LinuxUbuntu(云服务器)工具:vim 代码块/************************************************************************* >Fil......
  • 移植helloworld驱动模块到openwrt系统
    一、OpenWRT中的驱动  Openwrt源码中,所有扩展的软件包都在package目录下,自己添加的应用放在该目录下。  所有扩展的内核驱动都在package/kernel目录下,自己添加的驱动放在该目录下。二、添加驱动步骤在package/kernel目录下添加一个helloworld文件夹在helloworld添加一个Make......
  • 编写一款2D CAD/CAM软件(五)视图
    j-view模块目录配置:JCadincludej-viewj-view.hj-viewprjCMakeLists.txtsrcj-view.cppCMakeLists.txt存在多种计算机图形学的引擎,用于将图形绘制到显卡缓存并显示出来。有些引擎使用CPU的能力,有些则充分发挥GPU的......
  • XiaomiAX3000T—Openwrt
    固件降级如果未升级至1.0.64版本,请关闭自动系统更新。如果已经是该版本,需要进行降级操作,教程针对的版本只适用于1.0.47。去官网下载小米路由器修复工具:去MIUIRom下载低版本的固件:解压缩打开下载的软件,选择本地上传刚下载的固件即可:将网线插入任意LAN口中,选择固件和对应的......
  • 折腾PXE网络启动 pxe 双引导bios&uefi模式 OPENWRT
    简介:前两篇已经折腾了pxe引导bios和uefi,甭管启动的是啥,已经可以网络引导了。但是同时面对这两种系统的时候怎么办?需要通过dhcp的参数来控制谁启动什么。核心内容RFC4578:DynamicHostConfigurationProtocol(DHCP)OptionsfortheIntelPrebooteXecutionEnvironment(......
  • 使用OpenCV和PyQT编写的图片显示器,实现图片选择显示和保存
    使用OpenCV和PyQT编写的图片显示器简要效果代码简要为了避免重复编写pyqt控件,先写好此代码,方便使用。实现了以下基础功能:选择图片显示图片保存图片效果选择图片:显示图片:保存图片:代码importcopyimportcv2importsysfromPyQt5.QtWidgetsimport(......