Sqlite3 Porting and Test

前端之家收集整理的这篇文章主要介绍了Sqlite3 Porting and Test前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_404_1@一、sqlite数据库的编译:

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

@H_404_1@2、sqlite的安装:

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

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

@H_404_1@3、sqlite的交叉编译:

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

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

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

@H_404_1@#vim Makefile(第3步)

@H_404_1@Makefile文件修改情况:

@H_404_1@位置

@H_404_1@之前

@H_404_1@之后

@H_404_1@17行

@H_404_1@TOP = ../sqlite

@H_404_1@TOP = .

@H_404_1@73行

@H_404_1@TCC = gcc -O6

@H_404_1@TCC = arm-linux-gcc -O6

@H_404_1@81行

@H_404_1@AR = ar cr

@H_404_1@AR = arm-linux-ar cr

@H_404_1@83行

@H_404_1@RANLIB = ranlib

@H_404_1@RANLIB= arm-linux-ranlib

@H_404_1@86行

@H_404_1@MKSHLIB = gcc -shared

@H_404_1@MKSHLIB = arm-linux-gcc -shared

@H_404_1@注释掉

@H_404_1@TCL_FLAGS = -I/home/drh/tcltk/8.4linux

@H_404_1@LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm-ldl

@H_404_1@接下来,还需要修改的一个的文件是main.mk,因为Makefile包含了这个文件

@H_404_1@#vim main.mk (第4步)

@H_404_1@文件中的63行:

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

@H_404_1@把它替换成:

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

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

@H_404_1@#make (第5步)

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

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

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

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

@H_404_1@或使用下面的方法

@H_404_1@主机环境:虚拟机Ubuntu9.0

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

@H_404_1@软件包:sqlite-3.6.17.tar.gz

@H_404_1@步骤 0: mkdir /home/linux/sqlite

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

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

@H_404_1@步骤3: cd sqlite-3.6.17

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

@H_404_1@--disable-tcl /

@H_404_1@--host=arm-softfloat-linux-gnu

@H_404_1@步骤5: make & make install

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

@H_404_1@二、sqlite数据库的移植:

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

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

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

@H_404_1@cp sqlite3 /usr/bin(第7步)

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

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

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

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

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

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

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

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

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

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

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

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

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

@H_404_1@sqlite> select * from student;

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

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

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

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

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

@H_404_1@#include <stdio.h>

@H_404_1@#include <sqlite3.h>

@H_404_1@static int callback(void *NotUsed,int argc,char **argv,char **azColName)

@H_404_1@{

@H_404_1@int i;

@H_404_1@for (i = 0; i < argc; i++) {

@H_404_1@printf("%s = %s/n",azColName[i],argv[i] ? argv[i] : "NULL");

@H_404_1@}

@H_404_1@printf("/n");

@H_404_1@return 0;

@H_404_1@}

@H_404_1@int main(int argc,char **argv)

@H_404_1@{

@H_404_1@sqlite3 *db;

@H_404_1@char *zErrMsg = 0;

@H_404_1@int rc;

@H_404_1@if (argc != 3) {

@H_404_1@fprintf(stderr,"Usage: %s DATABASE sql-STATEMENT/n",argv[0]);

@H_404_1@exit(1);

@H_404_1@}

@H_404_1@rc = sqlite3_open(argv[1],&db);

@H_404_1@if (rc) {

@H_404_1@fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db));

@H_404_1@sqlite3_close(db);

@H_404_1@exit(1);

@H_404_1@}

@H_404_1@rc = sqlite3_exec(db,argv[2],callback,&zErrMsg);

@H_404_1@if (rc != sqlITE_OK) {

@H_404_1@printf(stderr,"sql error: %s/n",zErrMsg);

@H_404_1@sqlite3_free(zErrMsg);

@H_404_1@}

@H_404_1@sqlite3_close(db);

@H_404_1@return 0;

@H_404_1@}

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

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

@H_404_1@瘦身:#arm-linux-strip test

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

@H_404_1@主机环境:虚拟机Ubuntu9.0

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

@H_404_1@软件包:sqlite-3.6.17.tar.gz

@H_404_1@1. 类似出错信息:

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

@H_404_1@`sqlite3UnixDlopen':

@H_404_1@: undefined reference to `dlopen'

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

@H_404_1@`sqlite3UnixDlsym':

@H_404_1@: undefined reference to `dlsym'

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

@H_404_1@`sqlite3UnixDlclose':

@H_404_1@: undefined reference to `dlclose'

@H_404_1@collect2: ld returned 1 exit status

@H_404_1@2.解决方法

@H_404_1@在编译命令后加 “-ldl”

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

@H_404_1@>lsqlite3 -ldl

@H_404_1@3.迷惑细说

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

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

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

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

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

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

@H_404_1@ID = 1

@H_404_1@name = 孙悟空

@H_404_1@ID = 2

@H_404_1@name = 唐僧

@H_404_1@ID = 3

@H_404_1@name = 猪八戒

@H_404_1@ID = 4

@H_404_1@name = 沙和尚

@H_404_1@(结束, 国家认证)

@H_404_1@原文来自:

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

猜你在找的Sqlite相关文章