Sqlite3 Porting and Test

一、sqlite数据库的编译:

1、获得sqlite嵌入式数据库源码,本项目用的是sqlite-3.3.6.tar.gz。

2、sqlite的安装:

将sqlite-3.3.6.tar.gz下载到/root目录下。然后,通过下列命令解压缩sqlite-3.3.6.tar.gz:

# tar zxvf sqlite-3.3.6.tar.gz(第1步)

3、sqlite的交叉编译:

进入sqlite-3.3.6目录,在sqlite-3.3.6/目录下有一个Makefile范例文件Makefile.linux-gcc。首先通过下面的命令拷贝此文件并重命名为Makefile:

#cp Makefile.linux-gcc Makefile(第2步)

4、接下来,用vim打开Makefile文件并手动修改Makefile文件的内容。

#vim Makefile(第3步)

Makefile文件的修改情况:

位置

之前

之后

17行

TOP = ../sqlite

TOP = .

73行

TCC = gcc -O6

TCC = arm-linux-gcc -O6

81行

AR = ar cr

AR = arm-linux-ar cr

83行

RANLIB = ranlib

RANLIB= arm-linux-ranlib

86行

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包含了这个文件。

#vim main.mk (第4步)

文件中的63行:

select.o table.o tclsqlite.o tokenize.o trigger.o /

把它替换成:

select.o table.o tokenize.o trigger.o / 也就是把该行上的tclsqlite.o去掉。

5、最后就可以make了:/root/sqlite-3.3.6/make。

#make (第5步)

编译完成之后,将在sqlite3.3.6/目录下生成数据库文件sqlite3、库函数文件libsqlite3.a和头文件sqlite3.h。

大地小神补充:(上面方法可能出错)

若继续使用上面的方法, Hit the link below!:

http://www.elecfans.com/article/87/141/2010/20100311186619.html

或使用下面的方法:

主机环境:虚拟机Ubuntu9.0

交叉编译器:arm-softfloat-linux-gnu-gcc

软件包:sqlite-3.6.17.tar.gz

步骤 0: mkdir /home/linux/sqlite

步骤 1: cp sqlite-3.6.17.tar.gz /home/linux/sqlite

步骤2: tar zxvf sqlite-3.6.17.tar.gz

步骤3: cd sqlite-3.6.17

步骤4: ./configure --prefix=/home/linux/sqlite /

--disable-tcl /

--host=arm-softfloat-linux-gnu

步骤5: make & make install

步骤6: cd.. (include lib bin)

二、sqlite数据库的移植:

1、去掉/root/sqlite3.3.6目录下的sqlite3的调示信息:

arm-linux-strip sqlite3(第6步 /home/linux/sqlite/bin)

2、将sqlite3下载到开发板的/usr/bin目录:

cp sqlite3 /usr/bin(第7步)

3、在PC机的目录/usr/lib 中找到libsqlite3.so.0、libsqlite3.so.0.8.6这两个库文件,去掉调示信息后把它们复制到开发板的/usr/lib目录下:

arm-linux-strip libsqlite3.so.0 (/home/linux/sqlite/lib)

arm-linux-strip libsqlite3.so.0.8.6 (/home/linux/sqlite/lib)

cp –arf libsqlite3.so.0 libsqlite3.so.0.8.6 /usr/lib (第8步)

注:因为libsqlite3.so,libsqlite3.so.0是链接到libsqlite3.so.0.8.6的,所以拷贝是要加-arf。

4、然后执行下列命令新建一个数据库test.db:

/usr/bin#sqlite3 test.db(第9步 开发板)

进入sqlite>模式:.help可以获取帮助,.databases可以查看当前系统中存在的数据库,.tables可以查看当前数据库中存在的表,.quit和.exit可以退出。

sqlite> create table student(ID integer primary key,name text);

sqlite> insert into student values(1,'孙悟空');

sqlite> insert into student values(2,'唐僧');

sqlite> insert into student values(3,'猪八戒');

sqlite> insert into student values(4,'沙和尚');

sqlite> select * from student;

sqlite> update student set name='白骨精' where ID='2';

sqlite>delete from student where ID='2'; (第10步)

注意:sqlite模式下命令必须以分号“;”结束。

三、 编写应用程序对sqlite进行测试

1、编写测试程序:(第11步)

#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) {

printf(stderr, "SQL error: %s/n", zErrMsg);

sqlite3_free(zErrMsg);

}

sqlite3_close(db);

return 0;

}

2、交叉编译:(第12步)

#arm-linux-gcc -I /root/sqlite-3.3.6 -L /root/sqlite-3.3.6 -o test test.c -lsqlite3 -static

瘦身:#arm-linux-strip test

大地小神补充:(有可能出错)

主机环境:虚拟机Ubuntu9.0

交叉编译器:arm-softfloat-linux-gnu-gcc

软件包:sqlite-3.6.17.tar.gz

1. 类似出错信息:

/home/linux/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3ec): In function

`sqlite3UnixDlopen':

: undefined reference to `dlopen'

/home/linux/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3f4): In function

`sqlite3UnixDlsym':

: undefined reference to `dlsym'

/home/linux/sqlite/sqlite-3.4.2/libsqlite3.a(os_unix.o)(.text+0x3f8): In function

`sqlite3UnixDlclose':

: undefined reference to `dlclose'

collect2: ld returned 1 exit status

2.解决方法

在编译命令后加 “-ldl”

#arm-softfloat-linux-gnu-gcc -I include -L lib test.c -o test /

>lsqlite3 -ldl

3.迷惑细说

-I 指明了头文件sqlite3.h所在的目录;

-L 指定了库函数文件libsqlite3.a所在的目录

-lsqlite3 指明要链接静态库文件libsqlite3.a

3、下载到目标板进行测试:(第13步)

在开发板上新建一个目录:/#mkdir zhao

/zhao#./test test.db "select * from student"

ID = 1

name = 孙悟空

ID = 2

name = 唐僧

ID = 3

name = 猪八戒

ID = 4

name = 沙和尚

(结束, 国家认证)

clip_image001

原文来自:

http://wenku.baidu.com/view/93268269a45177232f60a20b.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值