NeuSoft(1)构建嵌入式交叉编译环境
操作系统版本:ubuntu 12.04
内核名称:Linux
内核发行版:3.2.0-generic
内核版本:#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011
硬件架构名称:i686
硬件平台:i386
操作系统:GNU/Linux
当前系统gcc版本号:4.6.3
在Linux中建立整个ARM交叉编译环境的整体过程为:
1、 下载源码包
2、 建立编译目录并设置环境变量
3、 安装内核头文件
4、 安装二进制工具(binutils)
5、 建立初始编译器工具链(简版gcc)
6、 建立glibc库
7、 建立全套编译器工具链(full gcc)
8、 验证
一、下载源码包
GNU的所有源码文件都可以到这个地址下载:http://ftp.gnu.org/gnu/
Linux Kernel源代码可以去这里下载:http://www.kernel.org
mpc可以去这里下载:http://www.multiprecision.org
下载的源码包如下:
binutils-2.21.1.tar.bz2
gcc-4.6.1.tar.gz
glibc-2.14.tar.gz
glibc-linuxthreads-2.5.tar.bz2
glibc-ports-2.13.tar.gz
gmp-5.0.2.tar.bz2
linux-2.6.32.45.tar.gz
mpc-0.9.tar.gz
mpfr-2.4.2.tar.gz
注:mpfr不建议使用3.0.0版本。mpfr-3.0.0有Bug,会导致gcc编译不过。

设置共享文件夹:

二、建立编译目录并设置环境变量
选定自己的工作目录,如我选择/opt/embedded作为自己的工作目录。然后再embedded中建立build-tools、kernel、tools三个文件夹。实例:
root@ubuntu:/opt/ming# cd /opt/
root@ubuntu:/opt# mkdir embedded
root@ubuntu:/opt# cd embedded/
root@ubuntu:/opt/embedded# mkdir build-tools kernel tools
root@ubuntu:/opt/embedded# cd build-tools/
root@ubuntu:/opt/embedded/build-tools# mkdir build-binutils build-boot-gcc build-glibc build-gcc
各文件夹的作用如下:
/opt/embedded:交叉编译环境的主目录
/opt/embedded/build-tools:存放binutils、gcc、glibc等GNU源码和用来编译这些源代码的目录
/opt/embedded/kernel:用来存放Linux内核源代码
/opt/embedded/tools:用来存放编译好的交叉编译工具和库文件
/opt/embedded/build-tools/build-binutils:编译binutils的目录
/opt/embedded/build-tools/build-boot-gcc:编译gcc启动部分的目录
/opt/embedded/build-tools/build-glibc:编译glibc的目录
/opt/embedded/build-tools/build-gcc:编译整个gcc的目录
建立好编译目录之后便是设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要重新运行Terminal)。如下:
export PRJROOT=/opt/embedded
export TARGET=arm-linux
export PREFIX=$PRJROOT/tools
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH

各个环境变量的意义如下:
PRJROOT:整个交叉编译环境的根目录
TARGET:目标文件对应的architecture,arm-linux表示编译出来的target只能在arm architecture中运行
PREFIX:目标文件夹的路径前缀
TARGET_PREFIX:目标文件夹的路径前缀路径
PATH:可执行文件路径,这里主要指定编译工具等
注:重启Terminal生效~!

三、安装内核头文件
将Linux内核源码解压至$PRJROOT/kernel目录,然后建立几个文件的符号链接,最后生成version.h文件。实例:
首先解压Linux内核源文件
root@ubuntu:/opt/embedded/kernel# cp /mnt/hgfs/VMwareShare_Ubuntux64/linux-2.6.32.45.tar.gz .
root@ubuntu:/opt/embedded/kernel# tar -xvf linux-2.6.32.45.tar.gz
root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux
root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux/include
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/linux /opt/embedded/tools/arm-linux/include/linux
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic /opt/embedded/tools/arm-linux/include/asm-generic
root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm /opt/embedded/tools/arm-linux/include/asm (也可能是是asm-arm,示内核版本而定)

下面检查上面创建的符号链接是否正确。实例:
root@ubuntu:/opt/embedded/kernel# cd /opt/embedded/tools/arm-linux/include/
root@ubuntu:/opt/embedded/tools/arm-linux/include# ll
asm -> /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm/
asm-generic -> /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic/
linux -> /opt/embedded/kernel/linux-2.6.32.45/include/linux/
有如上结果表示符号链接创建正确。
最后生成version.h文件。实例:
root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45#make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig



root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# cd /opt/embedded/kernel/linux-2.6.32.45/
root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# make include/linux/version.h
四、安装二进制工具(binutils)
Binutils是一些二进制工具集合,其中包含了常用的一些命令。首先将binutils-2.21.1.tar.bz2解压至build-tools,然后进入build-binutils目录,配置并编译binutils,最后使用make install进行安装。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/binutils-2.21.1.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools# tar -xjf binutils-2.21.1.tar.bz2
root@ubuntu:/opt/embedded/build-tools# cd build-binutils/
root@ubuntu:/opt/embedded/build-tools/build-binutils# ../binutils-2.21.1/configure --target=$TARGET --prefix=$PREFIX
root@ubuntu:/opt/embedded/build-tools/build-binutils# make
root@ubuntu:/opt/embedded/build-tools/build-binutils# make install
完成后,去$PREFIX中检查一下生成的工具。实例:
root@ubuntu:/opt/embedded/build-tools/build-binutils# cd /opt/embedded/tools/bin
root@ubuntu:/opt/embedded/tools/bin# ll

这些生成的文件的作用分别为:
arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息
arm-linux-ar:产生、修改和解开一个存档文件
arm-linux-as:GNU的汇编器
arm-linux-c++filt:C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt 就是实现这种反向的转化,根据标号得到函数名
arm-linux-elfedit:用途暂时未知
arm-linux-gprof:GNU汇编器预编译器
arm-linux-ld:GNU的连接器
arm-linux-ld.bfd:用途暂时未知
arm-linux-nm:列出目标文件的符号和对应的地址
arm-linux-objcopy:将某种格式的目标文件转化成另外格式的目标文件
arm-linux-objdump:显示目标文件的信息
arm-linux-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中
arm-linux-readelf:显示 elf 格式的目标文件的信息
arm-linux-size:显示目标文件各个节的大小和目标文件的大小
arm-linux-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4
arm-linux-strip:剥掉目标文件的所有的符号信息
五、建立初始编译器(简版 gcc)
Gcc是最主要的编译器。首先将gcc-4.6.1.tar.gz解压至build-tools,然后将gmp-5.0.2.tar.bz2、mpfr-2.4.2.tar.gz、mpc-0.9.tar.gz分别解压至gcc源码所在目录,并将目录重命名为gmp、mpfr、mpc,然后进入build-boot-gcc目录,进行编译配置,然后make all-gcc并安装,最后make all-target-gcc并安装。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/gcc-4.6.1.tar.gz .
root@ubuntu:/opt/embedded/build-tools# tar -xvf gcc-4.6.1.tar.gz
root@ubuntu:/opt/embedded/build-tools# cd gcc-4.6.1/
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpfr-2.4.2.tar.gz .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/gmp-5.0.2.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpc-0.9.tar.gz .
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpfr-2.4.2.tar.gz
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpfr-2.4.2/ mpfr
重命名
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xjf gmp-5.0.2.tar.bz2
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv gmp-5.0.2/ gmp
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpc-0.9.tar.gz
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpc-0.9 mpc
这里需要修改一下编译配置文件:
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# vi /opt/embedded/build-tools/gcc-4.6.1/gcc/config/arm/t-linux
将“TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC”改为
“TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h”。

然后便可以切换到目录build-boot-gcc进行编译了,实例:
root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cd /opt/embedded/build-tools/build-boot-gcc/
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --disable-decimal-float --with-newlib --disable-shared --disable-libmudflap --disable-libssp
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-gcc
gcc版本过高会导致如下错误:

使用gcc -v查看当前gcc版本

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-gcc
root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-target-libgcc
使用fedora16编译会出现如下错误:(暂未解决)

查看config.log:

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-target-libgcc
完成之后,$PREFIX/bin下又多了几个文件:
arm-linux-cpp*
arm-linux-gcc*
arm-linux-gcc-4.6.1*
arm-linux-gcov*

这些生成的文件的作用分别为:
arm-linux-cpp:GNU的C的预编译器
arm-linux-gcc:GNU的C语言编译器
arm-linux-gcc-4.6.1:GNU的C语言编译器,其实和arm-linux-gcc是一样的
arm-linux-gcov:gcc 的辅助测试工具,用来分析和优化程序
六、建立glic库
Glibc是交叉编译环境的运行库。首先将glibc-2.14.tar.gz解压至build-tools,然后将glibc-linuxthreads-2.5.tar.bz2解压至glibc源码所在目录,将glibc-ports-2.13.tar.gz解压至glibc源码所在目录,并重命名为ports。进入build-glibc文件夹,建立用于配置glibc的config.cache文件,然后配置并编译glibc,安装glibc,最后修改libc.so。实例:
root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/
root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-2.14.tar.gz .
root@ubuntu:/opt/embedded/build-tools# tar -xvf glibc-2.14.tar.gz
root@ubuntu:/opt/embedded/build-tools# cd glibc-2.14/
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-linuxthreads-2.5.tar.bz2 .
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xjf glibc-linuxthreads-2.5.tar.bz2
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-ports-2.13.tar.gz .
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xvf glibc-ports-2.13.tar.gz
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# mv glibc-ports-2.13/ ports
root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cd ../build-glibc/
建立用于配置glibc的config.cache文件,文件内容为:
libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_arm_tls=yes
编译glibc
root@ubuntu:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH BUILD_CC="gcc" CC=$TARGET-gcc ../glibc-2.14/configure --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/
root@ubuntu:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make
出错处理:
1)[ALL ] mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)
在gen-sorted.awk第19行,出错,这是一个简单的错误,缺少了转义符

解决办法:
用/usr/bin/gawk 替换/usr/bin/mawk,即
sudo apt-get install gawk
cd /usr/bin
sudo mv mawk mawk.bak
sudo ln -s gawk mawk
2)../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S
找到如下行:
ENTRY(__default_sa_restorer)
在其下添加:
END(__default_sa_restorer)
找到如下行:
ENTRY(__default_rt_sa_restorer)
在其下添加:
END(__default_rt_sa_restorer)
3)../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/unix/syscall-template.S
找到如下行:
#define T_PSEUDO(SYMBOL, NAME, N) PSEUDO (SYMBOL, NAME, N)
在其上添加:
#define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name); \
DO_CALL (syscall_name, args); \
cmn r0, $4096;
4)allocatestack.c:247:33: 错误:‘TLS_DTV_UNALLOCATED’未声明(在此函数内第一次使用)

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/nptl/allocatestack.c
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/elf/dl-tls.c

分别在文件中的include后面添加:
#define TLS_DTV_UNALLOCATED ((void *) -1l)
5)/opt/embedded/tools/lib/gcc/arm-linux/4.6.1/../../../../arm-linux/bin/ld: cannot find -lgcc_eh

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# ln -s /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc.a /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc_eh.a
6)../sysdeps/ieee754/dbl-64/s_fma.c:152:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fma.c
在文件中的include后面添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
7)../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: 错误:‘FE_TOWARDZERO’未声明(在此函数内第一次使用)

解决方法:
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fmaf.c
在文件中的include后面添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
8)root@ubuntu:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make 成功!

root@ubuntu:/opt/embedded/build-tools/build-glibc# make install_root=$TARGET_PREFIX prefix="" install
9)最后,修改libc.so便完成此步骤
root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../../tools/arm-linux/lib/libc.so
找到如下行:
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) )
将其改为:
GROUP ( libc.so.6 libc_nonshared.a )

七、建立全套编译器(full gcc)
首先进入build-gcc目录,然后配置并编译full gcc,最后安装就完成了。实例:
root@ubuntu:/opt/embedded/build-tools/build-glibc# cd /opt/embedded/build-tools/build-gcc/
root@ubuntu:/opt/embedded/build-tools/build-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libgomp
root@ubuntu:/opt/embedded/build-tools/build-gcc# make
root@ubuntu:/opt/embedded/build-tools/build-gcc# make install
完成之后,$PREFIX/bin下又多了几个文件:
arm-linux-c++*
arm-linux-g++*

这些生成的文件的作用分别为:
arm-linux-g++:GNU的c++编译器
arm-linux-c++:等同于arm-linux-g++
八、验证
使用vim编写一个简单文件,这里以hello.c为例:
然后执行编译命令:
root@ubuntu:/opt/embedded/tmp# arm-linux-gcc -static hello.c –o hello
编译完成后验证最终编译出的文件。实例:
root@ubuntu:/opt/embedded/tmp# file hello
hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.0.0, not stripped
有如上输出表示编译ARM版本程序成功。

NeuSoft(1)构建嵌入式交叉编译环境的更多相关文章
- Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解
转载:王文松的博客Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解 安装环境 Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 ...
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程
Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4. ...
- 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛. 安装步骤 1.准备工具安装目录 下载 ar ...
- Ubuntu 8.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
Linux版本:Ubuntu8.04 内核版本:Linux 2.6.24 交叉编译器版本:arm-linux-gcc-3.4.1 交叉编译器下载链接: https://share.weiyun.com ...
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4.4.3 交叉编译器下载 见这篇文章http://www.linuxidc.c ...
- Ubuntu18.04 LTS x64 构建ARM交叉编译环境(尝试,但失败了!!!估计是编译器没选对)
[测试而已,由于需要了解编译器和处理器体系,因此先放弃该方法] 动机 入门嵌入式开发,又需要 Windows 又需要 Linux,但资料给的竟然是 Ubuntu9,导致我不能使用 VSCode Rem ...
- Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总
闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...
- 【Linux学习】Ubuntu下嵌入式交叉编译环境arm-linux-gcc搭建
(1)首先选择一个路径用来存放arm-linux-gcc.我选用的是/home/book,并在以下建立一个目录arm-linux-gcc. (2)利用cp EABI-4.3.3_Emdedsky_20 ...
- Linux嵌入式交叉编译环境 的搭建【转】
转自:http://blog.csdn.net/woaixiaozhe/article/details/7395435 1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下 ...
随机推荐
- 圆形图片CircleImageView
github源码路径: https://github.com/hdodenhof/CircleImageView 第一步:将CircleImageView复制 第二步:将attrs.xml复制 第三步 ...
- js-Ajax与Comet
Ajax与Comet: 1.Ajax技术的核心是XHR(XMLHTTPRequest对象) 创建xhr对象: function createXHR(){ if(typeof XMLHttpReques ...
- virtualtree 的使用(Delphi)
VirtualTreeview的强大,毋庸置疑,不过,你能给演示演示,也不错,就是刚下来,只有一个可执行程序,感觉像病毒. 最近比较忙,没有上网,现在把我研究的结果和大家通报下,方便新手学习,避免走弯 ...
- 【CLR in c#】属性
1.无参属性 1.为什么有字段还需要属性呢? 因为字段很容易写出不恰当的代码,破坏对象的状态,比如Age=-1.人的年纪不可能为负数.使用属性后你可以缓存某些值或者推迟创建一些内部对象,你可以以线程安 ...
- 转载:python发送HTTP请求
1. [代码]GET 方法 import httplib #----------------------------- conn = httplib.HTTPConnection("www. ...
- Python基础1-Python环境搭建
Python环境搭建首先通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本: 若未安装则需要下载安装,下面为linux和windo ...
- HDU4758 Walk Through Squares(AC自动机+状压DP)
题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走.问从左上角走到右下角的走法有多少种走法包含那两种走法. D要走n次,R要走m次,容易想到用AC自动机 ...
- BZOJ3615 : MSS
将所有点按横坐标排序,那么最长上升子序列和最长下降子序列里必有一个长度不小于$\sqrt{n}$. 因为如果最长上升子序列很短,那么根据Dilworth定理,它的反链长度与它成反比. 因此可以将$n$ ...
- [转]Hive:简单查询不启用Mapreduce job而启用Fetch task
转自:http://www.iteblog.com/archives/831 如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive> SEL ...
- change,propertychange,input事件小议
github上关于mootools一个issue的讨论很有意思,所以就想测试记录下.感兴趣的可以点击原页面看看. 这个问题来自IE(LTE8)中对checkbox和radio change事件的实现问 ...