虚拟机上安装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。
皇天不负有心人,不要怕报错加油吧~