OpenWrt上用C来写一个Helloworld

   2016-12-23 0
核心提示:陆续用OpenWrt已经有5年多了, 一直以来都没有勇气用OpenWrt写原生的C程序.OpenWrt本身是维护了一些菜谱(recipe), 表现形式是Makefile. 它里面定义了包名/描述/类别/上游等等信息.make menuconfig的时候, 会先把package/目录里的所有包都扫描一遍, 生成总体的M

陆续用OpenWrt已经有5年多了, 一直以来都没有勇气用OpenWrt写原生的C程序.

OpenWrt本身是维护了一些菜谱(recipe), 表现形式是Makefile. 它里面定义了包名/描述/类别/上游等等信息.

make menuconfig 的时候, 会先把 package/ 目录里的所有包都扫描一遍, 生成总体的Makefile.

想单独编译这个包, make package/your_package/compile 即可, 会生成到 bin/ar71xx/base/your_package_blahblah.ipk

一个最小的例子

最好在同一个编译树下面做以下事情, 否则可能会因为libc版本不一致导致程序无法运行.

目录结构:

openwrt/package/helloworld
├── Makefile
└── src
    ├── helloworld.c
    └── 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
endef

define Build/Prepare
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/helloworld/install
	$(INSTALL_DIR) $(1)/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef

$(eval $(call BuildPackage,helloworld))

src/helloworld.c

#include <stdio.h>

int main(void)
{ 
	printf("hello world!\n");
	return 0;
}

src/Makefile

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

clean:
	rm *.o helloworld

编译

make menuconfig 
# 把Utilities里的helloworld要么打M, 要么打*
make package/helloworld/compile
ls bin/ar71xx/base/helloworld*.ipk

### 然后部署
scp bin/ar71xx/base/helloworld*.ipk root@192.168.1.1:/tmp/
opkg install helloworld*.ipk

注意: package/helloworld/src/ 里的 .o 文件要被清理掉, 我之前有一次是在电脑上执行了 package/helloworld/src/ 里的 make , 结果报了一个 libc 相关的错误.

用SDK来编译

用SDK编译的好处是不用把整个代码树clone下来, 省事, 优雅.

首先要选对版本

注意一定要用对应的SDK版本, 否则 libc 的版本或者其它库的版本对不上, 尽管编译出ipk包, 扔上去会执行不了, 提示

# ./helloworld
 - ash: no file helloworld found

SDK 页面上下载, 例如: https://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2

(或者用 TUNA的镜像: 示例 )

每个snapshot都会有对应的SDK可以下载, 同时, 也可以自己 make menuconfig 的时候生成一份SDK. (想必大家被坑过: 用snapshot版本, 结果后面snapshot更新了, 新的包拿下来无法使用….)

以下摘自 shadowsocks-openwrt :

tar xjf OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2
cd OpenWrt-SDK-ar71xx-*

./scripts/feeds update packages
./scripts/feeds install libpcre

git clone https://github.com/shadowsocks/openwrt-shadowsocks.git package/shadowsocks-libev
make menuconfig
make package/shadowsocks-libev/compile V=99

See also

 
标签: OpenWRT Makefile
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • ROS-RouterOS KVM 安装 OpenWrt 旁路使用
    ROS-RouterOS KVM 安装 OpenWrt 旁路使用
    原文:http://bbs.routerclub.com/thread-104864-1-1.html这里所讲是X86架构的RouteROS的KVM虚拟机,其实RouterOS的KVM很早就有,大概是4.多的版本就开始有只是RouterOS的KVM局限性大,只适合作为转发的服务,存储不能直接挂盘,只能挂载磁盘文件,虚拟机内存
    02-09
  • 简单记录极壹HC6361刷OP
    最早买极壹的时候,是他们宣传的『极客』和『出国加速』(你懂的),所以一开始买了两个,两个都是所谓的国际版~ 还挺贵,200多一个……后来又出了五颜六色版,我就买了个粉色、绿色、银色三个颜色……但是这批的就变成了『非国际版』,也就说,自带的免费出
  • 使用DNS-Forwarder提升ChinaDNS稳定性
    使用DNS-Forwarder提升ChinaDNS稳定性
    很多人使用Openwrt的路由器配合SS来提升访问海外网站的速度和稳定性,其中ChinaDNS被很多人作为防DNS污染的利器,但是大多数人目前还是使用ss-tunnel创建一个UDP转发隧道作为ChinaDNS的上游来进行查询,这在不少地区的ISP环境下常常出现不稳定的现象,aa65535
  • 为什么OpenWRT在中国会那么火?
    前言:作者佐须之男,08年开始从事嵌入式开发,擅长领域是网络设备相关的系统开发。比文是博主在网易云音乐http://music.163.com/#/djradio?id=341886058《嵌入式开发的那些》节目的文字版。OpenWRT在中国红红火火那么多年是大家众说周知的,随着越来越多的智
    10-01 OpenWRT
  • OpenWrt成功的秘密
    OpenWrt成功的秘密
    可以实现路由器功能的开源软件很多,为什么只有OpenWrt成功了?OpenWrt软件成功的关键在于3个方面:领导者、基础设施以及实现软件的技术。通常领导者是最重要的,因为领导者决定着社区的规则和技术方向,但是每个人都是独特的而且是无法复制的,因此通常无法
    10-01 OpenWRT
  • openwrt路由器怎么使用iptables进行域名过滤?
点击排行