PC 软件平台: Ubuntu v14
路由硬件: Mediatek MT7628AN
路由固件: OpenWrt Chaos Calmer 15.05.1
openWRT 项目根目录: /openwrt-mt7688
openWRT sqlite3 数据下载存放目录: /openwrt-mt7688/dl
openWRT sqlite3 下载包文件名: sqlite-autoconf-3081101.tar.gzsqlite-autoconf-3081101.tar.gz
交叉编译工具链存放目录:/openwrt-mt7688/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
交叉编译工具链 mipsel-openwrt-linux-gcc 存放目录:/openwrt-mt7688/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
注: 交叉编译工具链存放目录和交叉编译工具链 mipsel-openwrt-linux-gcc 存放目录都须加入 Ubuntu 环境 PATH 中, 以便调用;
操作步骤:
1. 解包
$tar xzvf ./sqlite-autoconf-3081101
2. 于 sqlite3 源文件目录上建立编译生成 lib 库后的目录
$cd sqlite-autoconf-3081101
$mkdir compiler
3. configure 配置和make编译
$./configure --prefix=/openwrt-mt7688/sqlite-autoconf-3081101/compiler --target=mipsel-openwrt-linux --host=mipsel-openwrt-linux LD=mipsel-openwrt-linux-ld
$make
$make install
说明:
* mipsel-openwrt-linux, 即是交叉编译器 mipsel-operwrt-linux-gcc 的前缀, 省略 -gcc,适用于 openWRT/MT7688
* --prefix: 编译后文件存放目录
* --target: 指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值
* --host: 指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测
4. 编译结果
如过程正常,/openwrt-mt7688/sqlite-autoconf-3081101/compiler 目录下会有 bin,include,lib 三个目录.
bin 目录下文件: sqlite3
include 目录下文件: sqlite3.h, sqlite3ext.h
lib 目录下文件: libsqlite3.a,libsqlite3.la,libsqlite3.so,libsqlite3.so.0,libsqlite3.so.0.8.6, 以及pkgconfig 文件夹
5. 测试文件 test-sqlite3.c
$cd /openwrt-mt7688/sqlite-autoconf-3081101
$vi test-sqlite3.c
// test-sqlite3.c
#include
#include
#include
#include "sqlite3.h"
int main( int argc, char **argv )
{
sqlite3 *db = NULL;
char db_name[] = "/test.db";
char *errMsg = NULL;
// 新建数据库
int ret = sqlite3_open( db_name,&db );
if ( ret != SQLITE_OK )
{
fprintf( stderr, "Can not open database: %s\n", sqlite3_errmsg( db ) );
return -1;
} else {
printf("open test.db!\n");
}
// 建表
char sql[] = "CREATE TABLE user(ID INT PRIMARY KEY NOT NULL,name CHAR(20),age INT);";
sqlite3_exec( db,sql,NULL,NULL,&errMsg );
if ( ret != SQLITE_OK )
{
printf( "%s\n",errMsg );
sqlite3_free( errMsg );
sqlite3_close( db );
} else {
printf( "to create table user SUCCESSFULLY!\n" );
}
// 插入数据
bzero( sql, sizeof(sql) );
strcpy( sql,"INSERT INTO 'user' VALUES(1,'Jack',16);" );
sqlite3_exec( db,sql,NULL,NULL,&errMsg );
strcpy( sql,"INSERT INTO 'user' VALUES(2,'John',18);" );
sqlite3_exec( db,sql,NULL,NULL,&errMsg );
// 查询数据
int n_row=0;
int n_column = 0;
char **record = NULL;
bzero( sql, sizeof(sql) );
strcpy( sql,"select * from user" );
sqlite3_get_table( db , sql , &record , &n_row , &n_column , &errMsg );
printf("rows: %d,columns: %d\n",n_row,n_column);
printf("all records:\n");
int circle = 0;
for ( circle=0;circle<(n_row+1)*n_column;circle++ )
{
printf( "record[%d]: %s\n",circle,record[circle] );
}
sqlite3_close(db);
return 0;
}
6. 编译测试文件
mipsel-openwrt-linux-gcc -I/openwrt-mt7688/sqlite-autoconf-3081101/compiler/include -L/openwrt-mt7688/sqlite-autoconf-3081101/compiler/lib -lsqlite3 test-sqlite3.c -o test-sqlite3
如过程正常,则会在 /openwrt-mt7688/sqlite-autoconf-3081101目录下,生成 test 执行文件, 把此文件发送到 MT-7688/openWRT 平台运行即可测试。
说明:
* 编译选项 '-L': 编译时查找库文件目录 , 编译选项 '-I': 编译时查找头文件目录, 编译选项'-l'(小写的L): 表示在库文件目录中寻找指定的库文件
* 不想用-L和-I选项,就需要把库和可执行文件拷到交叉编译环境的lib和bin目录下,这样在编译的时候会自动找到
* 此处编译生成的 test 文件在 Ubuntu 系统下无法运行, 只能在 openWRT 系统下运行;
* test 在 openwrt 系统下的运行结果;
open test.db!
to create table user SUCCESSFULLY!
rows: 2,columns: 3
all records:
record[0]: ID
record[1]: name
record[2]: age
record[3]: 1
record[4]: Jack
record[5]: 16
record[6]: 2
record[7]: John
record[8]: 18