openWRT 系统 Sqlite3 数据库, C 语言开发交叉编译环境建立

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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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

猜你喜欢

转载自blog.csdn.net/weixin_42396877/article/details/81435997
今日推荐