do{goodgoodstudy();daydayup();}while(!died)
分类: LINUX
2011-05-09 21:28:55
OS: fedora10;
编译器: gcc 版本 4.1.2 20070502 (Red Hat 4.1.2-12):
开发板: 基于Sep4020的UB4020EVB(1.6) 开发套件;
Linux内核: Linux Kernel v2.6.16:
交叉编译器: gcc version 3.4.1:
Sqlite: sqlite-3.3.8
三.PC端编译环境的安装:此处使用的为SQLite版本为sqlite-3.3.8.tar.gz,可以通过以下方式获得此压缩包(利用迅雷等工具下载)。
将此压缩包拷贝到 /root目录下,在终端中进入此目录,并解压sqlite-3.3.8.tar.gz压缩包:
[root@localhost ~]# cd /root/
[root@localhost ~]# tar -zxvf sqlite-3.3.8.tar.gz
将sqlite-3.3.8更名为sqlit_pc,并进入sqlite_pc目录:
[root@localhost ~]# mv sqlite-3.3.8 sqlite_pc
[root@localhost ~]# cd sqlite_pc
//进入目录后采用默认配置生成Makefile文件:
[root@localhost sqlite_pc]# ./configure
配置结束后进行编译并且将所生成的文件安装:
[root@localhost sqlite_pc]# make
[root@localhost sqlite_pc]# make install
Make install 安装以后会生成以下文件,系统默认的目录为 /usr/local:
lib: libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6
include: sqlite3.h
bin: sqlite3
由于/usr/local为系统路径,此时只要在终端直接输入sqlite3 [数据库名] 即可打开(没有时创建)一个数据库文件。
例1:在终端输入以下语句:
[root@localhost sqlite-3.3.8]# sqlite3 prochip.db
SQLite version 3.3.8
Enter ".help" for instructions
sqlite>
此时就会正确的打开(没有时创建)prochip.db数据库文件 。
sqlite> .e
退出数据库操作,具体的数据库操作在后节会有示例。
四.交叉编译环境下SQLite的安装:此处使用的为SQLite版本为sqlite-3.3.8.tar.gz,可以通过以下方式获得此压缩包(利用迅雷等工具下载)。
将此压缩包拷贝到 /usr/local/arm目录下,在终端中进入此目录,并解压sqlite-3.3.8.tar.gz压缩包:
[root@localhost sqlite_pc]# cd /usr/local/arm/
[root@localhost arm]# tar -zxvf sqlite-3.3.8.tar.gz
将此目录更名为sqlite_arm,然后进入此目录:
[root@localhost arm]# mv sqlite-3.3.8 sqlite_arm
[root@localhost arm]# cd sqlite_arm
与在PC环境下编译SQLite3不同,不能通过sqlite_arm目录下的configure脚本来生成Makefile文件。而是必须手动修改Makefile文件。在sqlite_arm目录下有一个Makefile范例文件Makefile.linux-gcc
首先通过下面的命令拷贝此文件并重命名为Makefile:
[root@localhost sqlite_arm]# cp Makefile.linux-gcc Makefile
利用gedit打开Makefile文件并手动修改Makefile文件的内容。
[root@localhost sqlite_arm]#gedit Makefile
找到Makefile文件中的下面这样一行(line 17):
TOP = ../sqlite
将其修改为:
TOP = .
找到下面这样一行(line 73):
TCC = gcc -O6
将其修改为:
TCC = arm-linux-gcc -O6
找到下面这样一行(line 81):
AR = ar cr
将其修改为:
AR = arm-linux-ar cr
找到下面这样一行(line 83):
RANLIB = ranlib
将其修改为:
RANLIB = arm-linux-ranlib
找到下面这样一行(line 86):
MKSHLIB = gcc -shared
将其修改为:
MKSHLIB = arm-linux-gcc -shared
找到下面这样一行(line 96):
TCL_FLAGS = -I/home/drh/tcltk/8.4linux
将其修改为:
#TCL_FLAGS = -I/home/drh/tcltk/8.4linux
注释掉下面这一行(line 103):
LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl
将其修改为:
#LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl
原则上,对Makefile的修改主要包括两个方面:首先是将编译器、归档工具等换成交叉工具链中的对应工具,比如:gcc换成arm-linux-gcc,ar换成ar-linux-ar,ranlib换 成arm-linux-ranlib等等;其次是去掉与TCL相关的编译选项,因为默认情况下,将会编译SQLite3的Tcl语言绑定,但是在移植到ARM-Linux的时候并不需要,因此将两个与TCL有关的行注释掉。
关闭并保存Makefile文件。
然后通过下面的命令修改main.mk文件,因为Makefile包含了这个文件。
[root@localhost sqlite_arm]# gedit main.mk
找到这个文件中的下面一行(line 63):
select.o table.o tclsqlite.o tokenize.o trigger.o \
把它替换成:
select.o table.o tokenize.o trigger.o \
也就是把该行上的tclsqlite.o去掉。这样编译的时候将不会编译SQLite3的Tcl语言绑定。
自此,修改工作就完成了,接下来就可以开始编译SQLite3了,这通过make命令即可完成:
[root@localhost sqlite_arm]# make
编译完成之后,将在sqlite_arm目录下生成一下文件:
库函数文件: libsqlite3.a
头文件: sqlite3.h
应用程序; sqlite3
此时将sqlite3应用程序拷贝到文件系统的系统路径 bin目录下,这样就可以在嵌入式开发平台上使用SQLite了。
例2:打开嵌入式开发平台,在串口终端中输入语句。
/# sqlite3 prochip.db
SQLite version 3.3.8
Enter ".help" for instructions
sqlite>
此时就会正确的打开(没有时创建)prochip.db数据库文件 。
sqlite> .e
退出数据库操作,具体的数据库操作在后节会有示例。
注:在嵌入式环境和PC环境下生成数据库文件的存储格式是相同的,在PC端和嵌入式端可以操作同一个数据库。
注:整个过程也可以使用命令:./configure --host=arm-linux --prefix=/root/sqlite-3.6.22/build/target --disable-tcl(修改的报错率低,也是对编译的一个很好的理解)
还有要注意板子所支持的交叉编译工具,有的板子arm-linux-gcc4.0以上都不识别。
还有什么问题可以相互交流。。。。。。
五.SQLite命令行功能的使用介绍:在SQLite的的使用中,在sqlite>下,我们可以直接使用一些命令行来直接对数据库进行操作,也可以直接输入标准的SQL语言来进行操作。下面就介绍一些简单的命令行和SQL语句的使用方式:
5.1 SQL语言:1.建立表: sqlite> create table test(name varchar(10),age smallint);
2.插入表: sqlite> insert into test values("prochip",5);
3.查询表: sqlite> select * from test;
prochip|5
4.修改表记录:sqlite> update test set age = 6 where name = "prochip";
5.删除表记录:sqlite> delete from test where name = "prochip";
6.删除表; sqlite> drop table test;
5.2 命令行语言:1) .help查看命令行的帮助文件
sqlite> .help
.bail ON|OFF Stop after hitting an error. Default OFF
.databases List names and files of attached databases
.dump ?TABLE? ... Dump the database in an SQL text format
……
.width NUM NUM ... Set column widths for "column" mode
2).tables 第一步建立好表后,可以通过此语句来查看已经存在的表:
sqlite> .tables
test
3).dump 第一步建立好表后,可以通过此语句生成数据库表的SQL脚本:
sqlite> .dump
BEGIN TRANSACTION;
CREATE TABLE test(name varchar(10),age smallint);
INSERT INTO "test" VALUES('prochip',5);
COMMIT;
4).schema ?TABLE?
第一步建立好表后,可以通过此语句生成形成数据库表的SQL脚本:
sqlite> .schema test
CREATE TABLE test(name varchar(10),age smallint);
5).quit 或者 .exit 退出命令行窗口。
sqlite>. quit
六.SQLite应用程序的编写:前面介绍了SQlite的安装和命令的使用,下面介绍在应用程序中进行数据库的操作。在正常的应用程序的操作中主要包含三种操作:增加、查询和修改,下面即介绍三个测试用例来分别介绍。
例一:创建数据库和表
#include
#include
#include "sqlite3.h" //包含SQLite的头文件
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("prochip.db", &db);
if( rc ) //如果出错,给出提示信息并退出程序
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else
{
printf("You have opened a sqlite3 database named prochip.db successfully!\n");
}
char *sql = "CREATE TABLE TestTable(ID INTEGER PRIMARY KEY,\
Name TEXT,Amount INTEGER);";
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //创建一个表
sql = "INSERT INTO \"TestTable\" VALUES( 001 ,'nokia', 39);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"TestTable\" VALUES( 002 , 'iphone' , 26);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"TestTable\" VALUES( 003 , 'palm' , 11);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sqlite3_close(db); //关闭数据库
return 0;
}
例二:查询数据库操作:
#include
#include
#include "sqlite3.h" //包含SQLite的头文件
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("prochip.db", &db);
if( rc ) //如果出错,给出提示信息并退出程序
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else
{
printf("You have opened a sqlite3 database named prochip.db successfully!\n");
}
int nrow = 0, ncolumn = 0; //保存获取信息的行数和列数
int i, j;
char **azResult; //二维数组存放结果
char *sql = "SELECT ID,name,Amount FROM TestTable;";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
for(i = 0; i < (nrow + 1); i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%s\t\t",azResult[nrow * i + j]); //打印查询信息
}
printf("\n");
}
sqlite3_close(db); //关闭数据库
return 0;
}
例三:修改数据库操作:
#include
#include
#include "sqlite3.h" //包含SQLite的头文件
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("prochip.db", &db);
if( rc ) //如果出错,给出提示信息并退出程序
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else
{
printf("You have opened a sqlite3 database named prochip.db successfully!\n");
}
char *sql = "UPDATE TestTable SET Amount=\"100\" WHERE ID = 002;";
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //跟新数据库
sqlite3_close(db); //关闭数据库
return 0;
}
七.应用程序的编译和运行: 7.1 PC端SQLite的编译和运行由于在PC端的sqlit3存在于系统路径中,所以在编译应用程序时,只需加上sqlite的库文件即可。
在PC机终端输入:
[root@localhost test]# gcc -o insert insert.c -lsqlite3
[root@localhost test]# ./insert
You have opened a sqlite3 database named prochip.db successfully!
[root@localhost test]# sqlite3 prochip.db
SQLite version 3.3.13
Enter ".help" for instructions
sqlite> select ID,Name,Amount from TestTable;
1|nokia|39
2|iphone|26
3|palm|11
sqlite>
其它操作类似。
7.2 嵌入式SQLite的编译和运行由于在交叉编译时,SQLite的库文件和应用程序都保存于/usr/local/arm/sqlite_arm目录下,因此我们只要在编译时将库文件和头文件都指定到这个目录即可,如在PC端终端输入:
[root@localhost ~]#arm-linux-gcc -o insert_arm insert.c -lsqlite3 -I/usr/local/arm/sqlite_arm/ -L /usr/local/arm/sqlite_arm/
到开发板启动后的串口终端中输入:
/test # ./insert_arm
You have opened a sqlite3 database named prochip.db successfully!
/test # sqlite3 prochip.db
SQLite version 3.3.8
Enter ".help" for instructions
sqlite> select ID,Name,Amount from TestTable;
1|nokia|39
2|iphone|26
3|palm|11
sqlite>
其它操作类似。