1、首先到http://www.sqlite.org/download.html下载linux版本的源码:sqlite-autoconf-3140100.tar.gz
2.将下载好的文件传到任意目录下,并解压缩
[mt@localhostsqlite-arm-linux]$ ls
sqlite-autoconf-3140100.tar.gz
[mt@localhostsqlite-arm-linux]$ tar -zxf sqlite-autoconf-3140100.tar.gz
[mt@localhostsqlite-arm-linux]$ ls
sqlite-autoconf-3140100 sqlite-autoconf-3140100.tar.gz
3.进入解压缩后的文件目录下,新建install文件夹,以存放后来生成的lib库函数和可执行文件
[mt@localhostsqlite-arm-linux]$ cd sqlite-autoconf-3140100
[mt@localhostsqlite-autoconf-3140100]$ ls
aclocal.m4 depcomp Makefile.msc sqlite3.c
compile INSTALL missing sqlite3ext.h
config.guess install-sh README.txt sqlite3.h
config.sub ltmain.sh Replace.cs sqlite3.pc.in
configure Makefile.am shell.c sqlite3.rc
configure.ac Makefile.in sqlite3.1 tea
[mt@localhostsqlite-autoconf-3140100]$ mkdir install
[mt@localhostsqlite-autoconf-3140100]$ cd install
4.进入install目录下,用pwd获取绝对路径,然后退出到上一层
[mt@localhostinstall]$ pwd
/nuc970bsp/sqlite-autoconf-3260000/install
[mt@localhostinstall]$ cd ..
5.使用configure配置文件如下
[mt@localhostsqlite-autoconf-3140100]$ ./configure--prefix=/tjk/tjk/nuc970bsp/sqlite-autoconf-3260000/install --host=arm-linuxCC=arm-linux-gcc
注:CC赋值为嵌入式开发环境所使用的交叉编译工具,后面接自己交叉编译器的路径, --host指定软件运行环境为arm-linux, --prefix指定源码交叉编译后生成文件的路径,我们指向了刚才新建的install文件夹
6.make和make install,查看是否生成以下文件
[mt@localhostsqlite-autoconf-3140100]$ make; make install
[mt@localhostsqlite-autoconf-3140100]$ cd install
[mt@localhostinstall]$ ls
bin include lib share
[mt@localhostinstall]$ ls bin/
sqlite3
[mt@localhost install]$ls lib/
libsqlite3.a libsqlite3.so libsqlite3.so.0.8.6
libsqlite3.la libsqlite3.so.0 pkgconfig
7.将install目录的bin/sqlite3放到目标板子/bin/下,
install目录的lib/libsqlite3.so libsqlite3.so.0.8.6 libsqlite3.so.0
8.测试是否移植成功,直接输入sqlite3,如下
# sqlite3
SQLite version 3.14.12016-08-11 18:53:32
Enter".help" for usage hints.
Connected to atransient in-memory database.
Use ".openFILENAME" to reopen on a persistent database.
注:
1)
sqlite> .help
sqlite3: can'tresolve symbol '__ctype_b_loc'
使用GCC编译程序时,如果链接到一些比较老的静态库,经常会碰到这个错误:can't resolve symbol '__ctype_b_loc',这是一个兼容性错误,这个错误出现的原因是,在glibc 2.3.2-11及其之后的C库版本,移除了__ctype_b和相关symbal的定义,因为它和新locale模型存在冲突无法并存,这意味着使用Redhat 7.3编译的C静态库,没有办法在RedHat 9及之后的版本保持二进制兼容(这些symbal在RedHat 8中曾经移除,但后来又重新加入了),必须使用新的编译器重新编译这些旧的库文件。
解决办法:找到sqlite文件中所有c和h中包含的#include <ctype.h>,注释掉,重新编译即可解决。
2)对C文件编译的错误
命令:arm-linux-gcc -o test -L ./lib –I ./ test.c-lsqlite3
编译参数介绍如下。
-lsqlite3:用于链接SQLite的开发库。
-lpthread:用于链接多线程库。
-L /lib:指示SQLite中链接库的路径,默认路径为/usr/local/lib,这个要根据自己的实际安装路径进行配置。
-I/include:用于指示SQLite中sqlite3.h头文件所在的目录,这个要根据自己的实际安装路径进行配置。
-static:用于静态编译,如果不加该选项,有时会提示无法找到动态链接库。根据自己的环境是否加上。
typedef int (*sqlite3_callback)(
void*, /* Dataprovided in the 4th argument of sqlite3_exec() */ sqlite3_exec()函数的第四个参数
int, /* The numberof columns in row */ 每一行的列数,即数据库中每条数据的包含项数
char**, /* An array ofstrings representing fields in the row */每条数据对应项目名字
char** /* An array ofstrings representing column names */每条数据对应项目名字的内容
);
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
fprintf(stderr, "%s: ", (const char*)data);
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;
char *sql;
const char* data = "Callback functioncalled";
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database:%s\n",sqlite3_errmsg(db));
exit(0);
}else
{
fprintf(stdout, "Opened databasesuccessfully\n");
}
/* Create SQL statement */
//创建
/* sql ="CREATE TABLE COMPANY(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME TEXT NOT NULL," \
"AGE INT NOT NULL," \
"ADDRESS CHAR(50)," \
"SALARY REAL );";
//插入
sql = "INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (1, 'Paul', 32,'California', 20000.00 ); " \
"INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (2, 'Allen', 25, 'Texas',15000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (3, 'Teddy', 23,'Norway', 20000.00 );" \
"INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (4, 'Mark', 25,'Rich-Mond ', 65000.00 );";
//查询
sql = "SELECT * from COMPANY";
//更改
sql = "UPDATE COMPANY set SALARY =25000.00 where ID=1; " \
"SELECT * from COMPANY";
//删除
sql = "DELETE from COMPANY where ID=3;" \
"SELECT * fromCOMPANY";
*/
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void *)data, &zErrMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Table created successfully\n");
}
sqlite3_close(db);
return 0;
}
sqlite3命令:
1)当出现“…>”时候,我们在输入一个”;”符号,它就会在切换回”sqlite>”状态,
.help可打印出帮助文档
.quit就可以退出sqlite3,回来shell界面。