嵌入式WEB服务器移植三部曲之SQLite的移植

来源:互联网 发布:金苹果淘宝培训学院 编辑:程序博客网 时间:2024/04/30 17:43

转自:http://hi.baidu.com/%D2%BC%BF%DA%B3%BE%B0%A3/blog/item/c3ddb508f218aecb267fb51f.html

BOA+PHP+SQLite移植三部曲之SQLite


第三部:SQLite的移植

1.下载 SQLite 3.3.8,http://sqlite.org 解压到根目录下:
[root@localhost /]# tar -xzvf sqlite-3.3.8.tar.gz

SQLite3的所有源代码文件都位于sqlite-3.3.8/src/目录下。

2.手动修改Makefile文件
在sqlite-3.3.8/目录下有一个Makefile范例文件Makefile.linux-gcc。首先通过以下命令拷贝此文件并重命名为Makefile:

[root@localhost /]# cd sqlite-3.3.8/
[root@localhost sqlite-3.3.8]# mv Makefile.linux-gcc Makefile

打开Makefile文件并手动修改Makefile文件的内容

TOP = ../sqlite
修改为:
TOP = .

TCC = gcc -O6
修改为:
TCC = arm-linux-gcc -O6

AR = ar cr
修改为:
AR = arm-linux-ar cr

RANLIB = ranlib
修改为:
RANLIB = arm-linux-ranlib

MKSHLIB = gcc -shared
修改为:
MKSHLIB = arm-linux-gcc -shared

注释掉下面这一行:
TCL_FLAGS = -I/home/drh/tcltk/8.4linux

注释掉下面这一行:
LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl

接下来,还需要修改的一个的文件是main.mk,因为Makefile包含了这个文件,找到这个文件中的下面一行:
select.o table.o tclsqlite.o tokenize.o trigger.o
把它替换成:
select.o table.o tokenize.o trigger.o
也就是把该行上的tclsqlite.o去掉。这样编译的时候将不会编译SQLite3的Tcl语言绑定。

至此,修改Makefile工作完成!

3.编译
[root@localhost sqlite-3.3.8]# make
编译完成后,将在sqlite3.3.8/目录下生成库函数文件libsqlite3.a和头文件sqlite3.h,这就是所需要的两个文件了。

4、测试

 创建test.c文件:
 #include <stdio.h>
 #include <sqlite3.h>

 static int
 callback(void *NotUsed, int argc, char **argv, char **azColName)
 {
 int i;
 
 for (i = 0; i < argc; i++) {
 printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
 }
 printf("\n");
 return 0;
 }
 
 int
 main(int argc, char **argv)
 {
 sqlite3 *db;
 char *zErrMsg = 0;
 int rc;
 
 if (argc != 3) {
 fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
 exit(1);
 }
 rc = sqlite3_open(argv[1], &db);
 if (rc) {
 fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
 sqlite3_close(db);
 exit(1);
 }
 rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
 if (rc != SQLITE_OK) {
 fprintf(stderr, "SQL error: %s\n", zErrMsg);
 sqlite3_free(zErrMsg);
 }
 sqlite3_close(db);
 return 0;
 }

将此源程序保存为test.c,然后,通过以下命令编译该程序:
[root@localhost /]# arm-linux-gcc -I /root/sqlite-3.3.8/ -L /root/sqlite-3.3.8 -o test1 test.c -lsqlite3

上述编译命令中,-I /root/sqlite-3.3.8指明了头文件sqlite3.h所在的目录,-L /root/sqlite3.3.8 指定了库函数文件libsqlite3.a所在的目录,-o test指定编译生成的文件名为test,test.c是源程序文件,-lsqlite3指明要链接静态库文件libsqlite3.a。

在开发板上创建sqlite目录,把编译生成的sqlite3和test1放到该目录下:
[root@Intel /]# mkdir /sqlite
[root@Intel /]# cp /mnt/sqlite-3.3.8/sqlite3  /sqlite
[root@Intel /]# cp /mnt/sqlite-3.3.8/test1  /sqlite

接下来就可以测试test程序了。test程序接受两个参数:第一个参数为数据库文件名,第二个参数为要执行的SQL语句。

[root@Intel sqlite]#./sqlite3 xyz.db
[root@Intel sqlite]#./test xyz.db "create table tbl0(name varchar(10), number smallint);"
[root@Intel sqlite]#./test xyz.db "insert into tbl0 values('cyc', 1);"
[root@Intel sqlite]#./test xyz.db "insert into tbl0 values('dzy', 2);"
[root@Intel sqlite]#./test xyz.db "select * from tbl0;"
name = cyc
number = 1

name = dzy
number = 2

解释一下上面所用的测试命令:第一条命令在 xyz.db这个数据库文件中创建了一个tbl0表,表中包含两个字段,字段name是一个变长字符串,字段number的类型为smallint;第二条命令向数据库的tbl0表中插入了一条记录(‘cyc’,1);第三条命令向数据库的tbl0表中插入了一条记录(‘dzy’,2);第四条命令则是查询表tbl0中的所有内容。

至此,SQLite3数据库在PXA270开发板上移植完成,测试结果表明数据库能够正常工作。