1. first, get sqlite-3.5.4.tar.gz from www.sqlite.org

2. unzip it
   #tar -zxvf sqlite-3.3.17.tar.gz
   解压缩完成后,cd sqlite-3.5.4进入目录后使用 ls可以列出其中的内容。其中的源代码和 SQLite 补充文件经过了很好组织,
   并且模拟了大部分的软件项目分发源代码的方式:
   * README 文件对该项目进行了描述,并且通常用于说明如何构建该软件。(README 文件还详细地介绍了使用条款,或者许可证、
     适用情况。许多项目的许可证代码都符合 GNU 公共许可版本 2 中的条款,即所谓的“copyleft”许可证。在许可证与您打算
     如何使用该软件之间可能存在一定的冲突,如果您对此有任何疑问,最好请教一下合适的法律顾问。)
   * src 目录中包含了相关的代码。
   * test 目录中包含了一组测试,以验证该软件的操作是否正确。在开始构建或者进行了任何修改之后,请运行这些测试,这样可
     以增加对该软件的信心。
   * contrib 目录中包含核心 SQLite 开发团队所没有提供的附加软件。对于像 SQLite 这样的库,contrib 中可能包含一些常用
     语言(如 C、Perl、PHP 和 Python)的编程接口。它可能还包括图形用户界面(GUI)包装,以及更多的内容。
   * 在其他文件中,Makefile.in、configure、configure.ac 和 aclocal.m4 用于生成在您的 UNIX 版本中编译 SQLite 软件的
     脚本和规则。如果这个软件足够简单,那么要编译其代码,可能只需要一条简单的编译命令即可。但是,因为存在如此之多的
    UNIX 变种(Mac OS X、Solaris、Linux、IBM? AIX? 和 HP/UX 等等),所以必须对宿主计算机进行分析,以确定它的功能及其
    实现。例如,邮件阅读应用程序可能会尝试确定本地系统是如何存储邮箱的,并包含对该格式的支持。

3. 交叉编译sqlite3提供两种版本的Makefile, 一种是通过configure由系统自动配置环境。选项-disable-tcl, -host=arm-linux等;
   另一种是由自己手动配置,将样板Makefile.linux-gcc拷贝Makefile,然后做一些适合自己环境的编辑。由系统自动配置的Makefile
   同时生成了动态库*.so和静态库*.a而且分别为这两种包编译sqlite3可执行文件【分别位于.lib目录下和当前目录】
  
使用Uclibc编译sqlite3:
   经过实验测试使用Uclibc编译Sqlite3时,不支持通过configure由系统自动配置环境,只能第二种方法来实现。步骤如下:
   第一步:cd sqlite-3.5.4  在sqlite-3.4.2/目录下有一个Makefile范例文件Makefile.linux-gcc。可以通过下面的命令拷贝此文件
           并重命名为Makefile:
   第二步:cp Makefile.linux-gcc Makefile
   第三步:手动修改Makefile文件的内容
           TOP = ../sqlite 将其修改为:TOP = .
           TCC = gcc -O6 将其修改为:TCC = arm-uclibc-linux-gcc -O6
           AR = ar cr 将其修改为:AR = arm-uclibc-linux-ar cr
           RANLIB = ranlib 将其修改为:RANLIB = aarm-uclibc-linux-ranlib  
           MKSHLIB = gcc -shared 将其修改为:MKSHLIB = arm-uclibc-linux-gcc -shared
           释掉下面的行(去掉与TCL相关的编译选项,因为默认情况下,将会编译SQLite3的Tcl语言绑定,但是在移植到ARM-Linux的
           时候并不需要,因此将两个与TCL有关的行注释掉):
                           #TCL_FLAGS = -I/home/drh/tcltk/8.4linux
                           #LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
          TLIBS =  将其修改为:TLIBS = -ldl
         
  第四步:修改main.mk
          把select.o table.o $(TCLOBJ) tokenize.o trigger.o \这一行中的$(TCLOBJ),也就是把tclsqlite.o去掉,这样编译的时候
          将不会编译SQLite3的Tcl语言绑定。
  第五步:make
  第六步:make install(可省)
          注意:运行make install默认是把sqlite3拷贝到/usr/bin下,libsqlite3.a拷贝到/usr/lib,sqlite3.h拷贝到/usr/include
          如需生成到自己的目录下可修改Makefile中install里面的内容。
上传两个Makefile文件

使用Uclibc编译基于sqlite3的应用程序:
   以SQLite官方站点http://sqlite.org的quick start文档中的测试程序为例对移植到uclibc上的SQLite3进行测试。程序名为test_sqlite.c
   编译该应用程序:arm-uclibc-linux-gcc -I /home/zouzheng/work/sqlite/sqlite-12-3/test_appliaction/include -L
   /home/zouzheng/work/sqlite/sqlite-12-3/test_appliaction/lib -o test_sqlite test_sqlite.c -lsqlite3 -ldl -lpthread
   编译完成后,可以通过NFS将test_sqlite下载到板上,接下来就可以测试test_sqlite程序。test程序接受两个参数:第一个参数为数据库
   文件名,第二个参数为要执行的SQL语句。
   # ./test_sqlite xyz.db "create table tbl0(name varchar(10), number smallint);"
   # ./test_sqlite xyz.db "insert into tbl0 values('cyc', 1);"
   # ./test_sqlite xyz.db "insert into tbl0 values('dzy', 2);"
   # ./test_sqlite xyz.db "select * from tbl0;"
   name = cyc
   number = 1
   name = dzy
   number = 2
   第四条命令则是查询表tbl0中的所有内容,与预期的一样,这条命令打印除了数据库中的两条刚插入的记录。

使用arm-linux-gcc-3.4.1编译sqlite3:
   第一步:在sqlite-3.5.4同级目录下建立arm-sqlite目录: mkdir arm-sqlite
   第二步:cd sqlite-arm-linux  在sqlite-3.5.4目录下有一个configure文件
   第三步:export PATH=/home/zouzheng/crosstool/usr/local/arm/3.4.1/bin:$PATH
   第四步:../sqlite-3.5.4/configure --disable-tcl --prefix=/home/zouzheng/work/sqlite/test_sqlite/arm-sqlite  --host=arm-linux
           这时候会在arm-sqlite目录下生成libtool、Makefile
   第五步:make && make install
           这时候会在arm-sqlite目录生成bin、include、lib目录

请注意:若在编译时候出现下面这种问题,请在编译选项中增加“-lpthread”,在编译Sqlite的时候可以把“THREADLIB = -lpthread“
前面”#“去掉

ibsqlite3.a(mutex_unix.o): In function `sqlite3_mutex_alloc':
mutex_unix.o(.text+0x38): undefined reference to `pthread_mutexattr_init'
mutex_unix.o(.text+0x38): relocation truncated to fit: R_ARM_PC24 pthread_mutexattr_init
mutex_unix.o(.text+0x44): undefined reference to `pthread_mutexattr_settype'
mutex_unix.o(.text+0x44): relocation truncated to fit: R_ARM_PC24 pthread_mutexattr_settype
mutex_unix.o(.text+0x58): undefined reference to `pthread_mutexattr_destroy'
mutex_unix.o(.text+0x58): relocation truncated to fit: R_ARM_PC24 pthread_mutexattr_destroy
libsqlite3.a(mutex_unix.o): In function `sqlite3_mutex_try':
mutex_unix.o(.text+0x100): undefined reference to `pthread_mutex_trylock'
mutex_unix.o(.text+0x100): relocation truncated to fit: R_ARM_PC24 pthread_mutex_trylock
libsqlite3.a(os_unix.o): In function `testThreadLockingBehavior':
os_unix.o(.text+0x7c): undefined reference to `pthread_create'
os_unix.o(.text+0x7c): relocation truncated to fit: R_ARM_PC24 pthread_create
os_unix.o(.text+0x90): undefined reference to `pthread_create'
os_unix.o(.text+0x90): relocation truncated to fit: R_ARM_PC24 pthread_create
os_unix.o(.text+0x9c): undefined reference to `pthread_join'
os_unix.o(.text+0x9c): relocation truncated to fit: R_ARM_PC24 pthread_join
os_unix.o(.text+0xa8): undefined reference to `pthread_join'
os_unix.o(.text+0xa8): relocation truncated to fit: R_ARM_PC24 pthread_join