二、移植过程
首先我从sqlite-amalgamation-3.6.1.tar.gz下载3.6.1源码,SQLite官方网为:http://sqlite.org。源码我放在/home/sqlite/目录下,在进行移植之前确定已经安装好交叉编译环境(我安装的是arm-linux-gnu-gcc 3.4.5).
(1)解压sqlite-amalgamation-3.6.1.tar.gz
/home/sqlite/#tar zxf sqlite-amalgamation-3.6.1.tar.gz
(2)进入解压出来的sqlite目录,创建sqlite-3.6.1目录,并进入该目录
/home/sqlite/sqlite-amalgamation-3.6.1#mkdir sqlite-3.6.1
(3)并且在此创建等会要安装的目录,在此我将把sqlite安装到/home/目录,于是创建/home/sqlite-arm目录
/home/sqlite/sqlite-amalgamation-3.6.1#mkdir /home/sqlite-arm
(4)接着输入以下命令:
sqlite-3.6.1#../configure --prefix=/home/sqlite-arm --host=arm-linux-gnu
configure:是软件的组态设置文件,产生对应平台的Makefile文件,--prefix:表示产生的文件的存放目录--host指定软件运行的系统平台 在此指定的是交叉编译工具链的前缀
(5)接着进行编译并进行安装
sqlite-3.6.1# ls
config.log config.status libtool Makefile
sqlite-3.6.1#make \\根据Makefile的内容 编译出符合平台的可执行文件
sqlite-3.6.1#make install \\安装编译成功的软件
(6)执行完以上命令就会在/home/sqlite-arm/目录下产生:bin,include,lib
sqlite-3.6.1#ls /home/sqlite-arm
bin include lib
(7)可以分别使用如下命令把动态库文件的调试信息给剥离,减少文件所占有的空间
sqlite-3.6.1#cd /home/sqlite-arm
sqlite-arm#cd lib
sqlite-arm/lib#ls
libsqlite3.a libsqlite3.so libsqlite3.so.0.8.6
libsqlite3.la libsqlite3.so.0
sqlite-arm/lib#arm-linux-gnu-strip libsqlite3.so.0.8.6
sqlite-arm/lib#cd ../bin
sqlite-arm/bin# ls
sqlite3
sqlite-arm/bin#arm-linux-gnu-strip sqlite3
(8)最后把整个/home/sqlite-arm目录拷贝到板子的网络文件系统中,在此我的板子NFS文件系统在/rootfs/filesystem/
sqlite-arm/bin#cd ../../
home#cp sqlite-arm /rootfs/filesystem/home/ -a (记得加-a,这样就会把软链接一起拷贝)
home#cd /rootfs/filesystem/home/
/rootfs/filesystem/home# ls
caoyi sqlite-arm
/rootfs/filesystem/home#cd sqlite-arm
/rootfs/filesystem/home/sqlite-arm#ls
bin include lib
(9)把需要的动态库拷贝到根文件系统的/lib目录中
rootfs/filesystem/home/sqlite-arm# cp ./lib/* ../../lib/ -a
这样动态编译的程序就不会因为找不到库文件而烦恼啦!
至此已经移植好了sqlite3。可执行文件在bin目录,include目录包含一些头文件,lib目录包含一些动态库。
三、测试
(1)以下#开头的是在开发板终端命令
# cd /home
# ls
adc fadc shyi sqlite-arm
# cd sqlite-arm/
# ls
bin include lib
# cd bin/
# ls
sqlite3
# ./sqlite3
SQLite version 3.6.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
这时表示成功,不过此时再也不能做其它事了,只有重启开发板。
(2)下面,编写两个连接sqlite数据库的C程序,在fs2410上运行:
测试程序一:
/rootfs/filesystem/home# vim test1.c (主机上编写哦)
#include <stdio.h> #include "sqlite3.h" int main(void) rc = sqlite3_open("test.db",&db); if(rc) { s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 0; |
交叉编译:
/rootfs/filesystem/home# arm-linux-gnu-gcc -I./sqlite-arm/include/ -L./sqlite-arm/lib/ test.c -o test -lsqlite3
-I指定要包含的头文件路径,-L指定动态库的路径,-lsqlite3动态库的名字。在终端进入根文件系统的/home目录中执行:
# ./test
Open test.db successfully!
这时会出现一个test.db文件。
我们再写个包含连接数据库,创建表,插入数据等SQL语句的C语言程序。
测试程序二:
/rootfs/filesystem/home# vim test2.c (这是官方测试程序,主机上编写哦)
#include <stdio.h> #include "sqlite3.h" static int callback(void *NotUsed, int argc, char **argv, char **azColName) "NULL"); int main(int argc, char **argv) if (argc != 3) { statement\n", arg sqlite3_errmsg(d |
交叉编译:
/rootfs/filesystem/home# arm-linux-gnu-gcc -I./sqlite-arm/include/ -L./sqlite-arm/lib/ test2.c -o test2 -lsqlite3
接下来就可以测试test程序了。test程序接受两个参数:第一个参数为数据库文件名,第二个参数为要执行的SQL语句。程序中与SQLite3的API相关的地方主要有四个:第27行的sqlite3_open(),第33行的sqlite3_exec(),第30行和第38行的sqlite3_close(),第36行的sqlite3_free()。关于SQLite3的API接口请参考上几篇文章。
下面是测试test程序的完整过程
# ./test2 test.db "create table tb(name varchar(10),number smallint);"
# ./test2 test.db "insert into tb values('caoyi',1);"
# ./test2 test.db "insert into tb values('huayun',2);"
# ./test2 test.db "select * from tb;"
@ = caoyi
@ = 1
@ = huayun
@ = 2
解释一下上面所用的测试命令:第一条命令在test.db这个数据库文件中创建了一个tb表,表中包含两个字段,字段name是一个变长字符串,字段number的类型为smallint;第二条命令向数据库的tbl0表中插入了一条记录(‘caoyi’,1);第三条命令向数据库的tb表中插入了一条记录(‘huayun’,2);第四条命令则是查询表tb中的所有内容,与预期的一样,这条命令打印除了数据库中的两条刚插入的记录。由此可以得出结论,这几条命令确实都已经按照预期的目标工作了。同时,在向数据库中插入上面所示的数据之后,可以看到数据库文件test.db大小已经发生了变化:
之前:
rootfs/filesystem/home# ll -h test.db
-rw-r--r-- 1 root root 1 2011-09-17 02:01 test.db
现在:
rootfs/filesystem/home# ll -h test.db
-rw-r--r-- 1 root root 2.0K 2011-09-17 02:04 test.db
此时数据库文件test.db的大小为2K。自此,SQLite3数据库在FS2410评估板上移植完成。测试结果表明数据库能够正常工作。
四、结论
SQLite是一个优秀的嵌入式数据库。本文详细描述了如何将SQLite3移植到ARM-Linux平台上,并对移植后的SQLite3进行了简单的测试。SQLite功能强大、效率高、零配置、体积小等诸多优点使得它很适用于嵌入式移动设备环境中。因此本文给出的移植SQLite3的细节具有积极意义。由于SQLite3采用C语言开发,因此可移植性非常好。本文所讨论的方法稍加修改也可适用于其它操作系统平台。