目的不是为了编译固件,而是为了一个是编译可执行文件,放倒op的路由器上跑,另一个目的是安装一些开源软件折腾下(例如ss-lib),需要打包成 .ipk 格式

路由设备信息

erya@ERYA:~$ cat /proc/cpuinfo
system type     : Atheros AR9341 rev 1
machine         : Atheros DB120 reference board
processor       : 0
cpu model       : MIPS 74Kc V4.12
BogoMIPS        : 266.64
wait instruction    : yes
microsecond timers  : yes
tlb_entries     : 32
extra interrupt vector  : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0000, 0x0ff8, 0x0ff8, 0x0ff8]
isa         : mips1 mips2 mips32r1 mips32r2
ASEs implemented    : mips16 dsp dsp2
shadow register sets    : 1
kscratch registers  : 0
core            : 0
VCED exceptions     : not available
VCEI exceptions     : not available

erya@ERYA:~$ uname -a
Linux ERYA 3.10.10 #10 Mon Sep 7 10:04:34 CST 2015 mips GNU/Linux

怎么交叉编译出一个可执行文件 ?

现在Centos上测试,需要特殊的GCC,也叫toolchain工具链 文档, 大部分的教程的做法都是自己下载源码来 编译工具链,比较漫长的过程。

只找到了14.07版本预编译的工具链,15版本已经不提供了, toolchain没写是Ubuntu还是哪个发行版本,测试没成功 官方的交叉编译步骤 ,看样子还是需要源码编译 toolchain,然后在编译相应的软件。

  • Compile program for OpenWrt

  • OP交叉编译好教材 编译可执行文件

  • build-package-your-software-for-openwrt

  • centos openwrt 主要参考

  • 中文安装wiki

  • Building Openwrt Packages

  • openwrt feed是什么? feeds 中对应的是一个软件list地址,可以把这些软件编译到openwrt固件中,使得系统使用更方面。

  • 如果我只想编译 toolchain? 在编译配置的时候 make menuconfig 选择编译toolchain Build the OpenWrt based toolchainAdvanced configuration options 选择 gdb和 debugging symbols

  • 编译包下载慢怎么解决? 编译时候下载的包一般在 ./dl/ 目录下,这里有个国内收集好的下载地址, 可以在编译下载中断的时候,在这里下载那些下载不到的包放到 dl目录,正常情况下是会有几个包下载不了。

———————- Centos6 编译toolchain ——————

用的是dreambox版本测试,不要用root用来操作,麻烦的是下载慢,编译慢(大概5个小时)

yum install -y subversion binutils bzip2 gcc gcc-c++ gawk gettext flex
yum install -y ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker
yum install -y glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget

$ git clone git://git.openwrt.org/14.07/openwrt.git
$ cd openwrt
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a
$ ./scripts/feeds list -s #查看feed源
$ make defconfig
$ make menuconfig #Target System,Subtarget
$ make V=s 2>&1 | tee build.log | grep -i error #等吧 很久

编译toolchain之后开始配置编译环境来编译 hello world,一种是编译成可执行文件,一种是编译成 ipk包。

直接编译可执行文件, hello.c放在 openwrt 根目录下

[lzz@orangleliu openwrt]$ cat hello.c
#include <stdio.h>
int main(void)
{
        printf("Hello World\n");
        return 0;
}

# 设置环境变量(可以写到文件中自动加载 如果LDCFLAGS,LD_LIBRARY_PATH文件夹为空,请看target-mips_34kc_uClibc-0.9.33.2)
export STAGING_DIR=/data/openwrt/staging_dir
export TOOLCHAIN_DIR=$STAGING_DIR/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
export LDCFLAGS=$TOOLCHAIN_DIR/usr/lib
export LD_LIBRARY_PATH=$TOOLCHAIN_DIR/usr/lib
export PATH=$TOOLCHAIN_DIR/bin:$PATH
$ mips-openwrt-linux-gcc hello.c -o hello

[lzz@orangleliu openwrt]$ file hello
hello: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 ... #在路由上测试可以执行
  • 如果编译需要依赖其他动态库,例如lua,native 平台只要 -llua就行了,交叉编译怎么做呢?

    • 是build toolchain时候没有选择liblua,重新选择后编译,发现 头文件在 staging_dir/target-xxx 文件下,staging/toolchain-xxx下并没找到 lua.h等文件(配置有没搞懂的地方)
  • 比如说编译时候少了一个库,每次需要增加的时候都要重新编译整个工具链,非常慢,怎么搞?

    • 一个思路是利用编译的cache, openwrt中也有ccache,开发环境可以开启,

    • 一个思路是只编译需要的部分,在 make menuconfig 选择到包,然后 类似make package/network/utils/curl/compile V=s

  • 编译之后生成的 build_dir 和 staging_dir 有什么不同?

    • build_dir 存放是源码解压之后的文件,使用他们来编译

    • staging_dir 编译好的工具,包,固件等

    • toolchain 是给host主机用的, target 是给目标主机(openwrt安装机器)用的

  • menuconfig Libraries选项中,module 和 build-in 的区别是什么?

    • module选择的时候显示M,表示只编译成ipk,并不打到固件中
  • 编译好的 .ipk在哪里 ?

    • ./bin/ 目录下, 例如 ./bin/ar71xx/packages/

Makefile编译ipk && 开源项目编译(例如tcpdump,nginx), 后续使用时记录

编译一个ipk

开源项目的第三方packages是最好的学习案例 https://github.com/shadowsocks/openwrt-shadowsocks 就不错

CentOS6 上OpenWRT交叉编译的更多相关文章

  1. CentOS6上无法启动NFS服务

    CentOS6上无法启动NFS服务 1.系统环境 物理机:Windows 7(32位)旗舰版 虚拟机:CentOS 6.5 2.问题描述 安装好nfs应用程序之后,打算启动nfs服务,却出现以下的报错 ...

  2. Solr6.5在Centos6上的安装与配置 (一)

    这篇文章主要是介绍在Centos6上Solr6.5的安装与配置. 一.安装准备及各软件使用版本说明: 1.JDK8,版本jdk1.8.0_121下载地址:jdk-8u121-linux-x64.tar ...

  3. 在centos6上实现编译安装lamp和wordpress,并编译xcache

    author:JevonWei 版权声明:原创作品 软件环境: centos6.9 httpd-2.4.27.tar.bz2 apr-1.5.2.tar.bz2 apr-util-1.5.4.tar. ...

  4. 在CentOS6上配置MHA过程全记录

    在CentOS6上配置MHA过程全记录 MHA(Master High Availability)是一款开源的MariaDB or MySQL高可用程序,为MariaDB or MySQL主从复制架构 ...

  5. 在CentOS6上利用PXE+Kickstart+Apache+DHCP实现无人值守安装

    在CentOS6上利用PXE+Kickstart+Apache+DHCP实现无人值守安装 1.PXEServer:OS:CentOS6.9IP:172.16.25.69: (1)apache:# mo ...

  6. [svc]centos6上部署openvpn+gg二步认证

    最近又发现个新的vpn: wireguard 为了满足员工在家办公的需求.需要 openvpn+gg方案 在centos6上部署openvpn 参考 1.安装前准备 wget -O /etc/yum. ...

  7. 在 CentOS6 上安装 GraphicsMagick-1.3.30

    在 CentOS6 上安装 GraphicsMagick-1.3.30 1.简介: 1.1.在介绍 GraphicsMagick 前我们不得不先介绍下 ImageMagick: ImageMagick ...

  8. centos6上使用fpm打python2.7 rpm包并兼容python2.6

    centos6上使用fpm打python2.7 rpm包并兼容python2.6 作者 运维小兵_加油 关注 2016.09.22 00:28 字数 501 阅读 45评论 0喜欢 1 工作中我们常常 ...

  9. OpenWRT交叉编译

    对于当前不在OpenWRT repository中的软件,如果是用源码形式发布的,那么可以用OpenWRT Buildroot进行交叉编译. 首先编译好Buildroot(一般编译过一次固件,就已经编 ...

随机推荐

  1. java 反射机制 观点

    反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本 ...

  2. 如何joomla修改版权信息

    1.在language\zh_CN目录下有一个zh-CN.mod_footer.ini文件,修改里面的内容: 2.具体模板的html\mod_footer目录下的default.php文件内(具体文件 ...

  3. 转:函数signal()

    from:http://blog.sina.com.cn/s/blog_4b226b92010119l5.html 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收 ...

  4. Spring动态切换多数据源解决方案

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...

  5. linux下安装apache(httpd-2.4.3版本)各种坑

    博主的linux是ubuntu 14.04.3. 在安装apache最新版httpd-2.4.3的时候遇到各种坑. 先提供安装apache httpd-2.4.3所需要的包,博主已经整理好,下载地址: ...

  6. 利用LogParser将IIS日志插入到数据库

    利用LogParser将IIS日志插入到数据库 上面的博文是定制一个计划任务来将log日志定时的导入数据库      下面这篇博文是用cmd指令将日志导入到一张sql表中,是一次性操作   Log P ...

  7. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  8. 剑指Offer——知识点储备-Java基础

    剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...

  9. 设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

    我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像 T ...

  10. Java进阶(四十五)java 字节流与字符流的区别

    java 字节流与字符流的区别(转载)   字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?   实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...