虚拟机上安装openwrt并开发ipk包

                                                                               虚拟机上安装openwrt并开发ipk包

在上次的编译中,我们得到了一个vmdk文件,目录如下图所示,在bin/targets/x86/generic下,我们可以利用这个vmdk文件在虚拟机上进行安装,先将此vmdk文件利用xftp软件通过ssh访问从linux服务器上传到windows中,并且再新开启一个虚拟机并装上此虚拟镜像。

成功如图:网上教程很多,不再累述

 

接下来我们要做的是在linux系统中利用sdk编译开发ipk包,并将其安装到openwrt虚拟机上进行运行。

 

  • 编译ipk包:

首先打开unbunt虚拟机,找到sdk文件,文件路径应该在openwrt路径下,如图·应该是openwrt/bin/targets/x86/generic/..

接下来右键点击并提取到此处,得到一个文件夹,我们可以发现此文件夹与openwrt源文件的目录结构基本相同。为了方便,我们将此文件夹剪切到/Home文件夹,并且将其重命名为opensdk,我们开发需要在此文件夹中进行,所以它的位置并不重要。

 

接下来的步骤:

1、cd opensdk/package进入opensdk/package目录

2、在package下创建文件夹helloworld :mkdir helloworld

3、进入helloworld文件夹创建src文件夹

   输入cd helloworld ;mkdir src

4、进入src文件夹并创建helloworld.c文件和Makefile文件

输入cd src;  touch helloworld.c Makefile

5、开始编辑两个文件:

1)helloworld.c

#include<stdio.h>

int main()

{

    printf("Hello world!\n\n");

    return 0;

}

2)编写Makefile文件

写法一:

helloworld: helloworld.o

   gcc -o helloworld helloworld.o

helloworld.o: helloworld.c

   gcc -c -o helloworld.o helloworld.c

写法二:

helloworld : helloworld.o

    $(CC) $(LDFLAGS) helloworld.o -o helloworld

helloworld.o : helloworld.c

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

clean :

rm *.o helloworld

Makefile文件最好用第二个方式写

6、退出src目录进入helloworld文件夹,并创建Makefile文件,这个文件与src中的文件夹不一样

即touch Makefile

7、编辑Makefile

使用命令:vim Makefile(注意不要使用gedit命令)

Makefile文件内容如下:

include $(TOPDIR)/rules.mk

#在Makefile的开头,包含包的基本信息,如Makefile中的$(BUILD_DIR)、$(INCLUDE_DIR)、$(CP)、$(INSTALL_DIR)、$(INSTALL_BIN)都是这里定义。具体内容在源码主目录下查看rules.mk文件.

 

PKG_NAME:=helloworld #软件包名称,在menuconfig和ipkg可以看到。

PKG_RELEASE:=1 #软件版本号。

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

#软件包编译目录。它的父目录为$(BUILD_DIR)。

 

include $(INCLUDE_DIR)/package.mk

#在软件包的基本信息完成后再引入,定义了用户态软件包的规则。编译包分为用户态和内核模块,用户态软件包使用Package,内核模块使用KernelPackage。$(INCLUDE_DIR)/Kernel.mk文件对于软件包为内核时不可缺少,$(INCLUDE_DIR)/package.mk应用在用户态。

 

define Package/helloworld

#用户态软件包。用户程序的编译包以Package/开头,定义包的名称为helloworld。

SECTION:=utils #包的类型为utils

CATEGORY:=Utilities #目录为Utilitis,即文件在menuconfig中的位置。

TITLE:=Helloworld -- prints a snarky message

#用于软件包的简短描述,将显示在menuconfig中。

endef

 

define Package/helloworld/description

It's my first package demo.

endef

#软件包的详细描述,将显示在make menuconfig中。

 

define Build/Prepare

echo "Here is Package/Prepare"

    mkdir -p $(PKG_BUILD_DIR)

    $(CP) ./src/* $(PKG_BUILD_DIR)/

endef

#编译准备方法:对于非网上下载或自行开发的软件包必须说明编译准备方法。首先创建软件包目录,然后将源码拷贝到刚刚创建的目录中。按OpenWrt的习惯,一般把自己设计的程序全部放在src目录下。

 

define Package/helloworld/install

#软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系统的镜像文件系统目录,因此$(1)表示嵌入系统的镜像目录。

echo "Here is Package/install"

$(INSTALL_DIR) $(1)/bin

#创建所属用戶可读写、执行,其他用戶可读可执行的目录

$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/

#编译好的文件到镜像文件目录

endef

$(eval $(call BuildPackage,helloworld))

#使用eval函数实现前面完成的各种定义。

对于一般软件包:$(eval $(call Package,$(PKG_NAME)))

对于内核模块:$(eval $(call KernelPackage,$(PKG_NAME)))

如果一个软件包有多个程序,如一个应用程序有自己的内核模块,上面使用的PKG_NAME需要灵活变通。eval函数可能有多个。

注意Makefile文件的格式,绿字的需要首行加Tab缩进

并且每一行末尾不能留空格,方法自行百度,不满足这两条编译报错

8、返回sdk根目录下

即在opensdk目录下输入make menuconfig

按"/"后,输入helloworld,搜索对应的路径

接着到:目录下,找到helloworld并按空格打开:

保存并退出。

(9)、编译在sdk目录下:

$make package/helloworld/compile V=s

编译中可能会报错,一是Makefile的格式出错,上面写了两个注意事项,第二个可能会出现如下报错

Openwrt sdk compile package error:package helloworld is missing dependencies for the following libraries:libc.so.6

这是因为你在src文件中对helloworld.c进行编译了生成了helloworld.o文件,只要返回src文件夹并执行:make clean即可

 

10、编译成功,编译结果会放在bin/packages/mips_24kc/base目录下,生成helloworld_1_ mips_24kc.ipk。

 

皇天不负有心人,不要怕报错加油吧~

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值