SQlite是一个开源的数据库软件,特性和性能就不介绍了,网上大量资源。
PC端是Ubuntu 14.03。
ARM的平台是OMAPL138。
获取源代码的方式,官方网站提供了最新的源码包下载,本次移植所使用的版本是3.9.2
官网下载地址:http://www.sqlite.org/download.html
选择Source code栏目下面的sqlite-autoconf-3090200.tar.gz
下面说明我的移植过程:
下载好后将源码包放在主目录下
1、解压源码包
$tar -zxvf sqlite-autoconf-3090200.tar.gz
2、创建临时目录
实验性的东西最好先临时创建文件夹:
$mkdir sqlite
$cd sqlite
$mkdir arm pc
在主目录下将解压出来的源码包文件分别拷贝到上sqlite下的两个文件夹下。
3、编译PC端的版本
$cd pc
$./configure --prefix=/usr/local
$make
$sudo make install
上面配置命令中,--prefix选项后面的是编译后的安装路径,这个路径是可以自定义的,但是这个路径一定要指定为绝对路径。
安装完成后,产生的文件会存放在前面--prefix选项指定的目录,bin下面存放着可执行程序sqlite3,lib下面存放着库文件,include目录下放的是头文件,编写应用程序的时候需要指定这个目录。
4、检验安装
完成前面3步后,就可以在PC上使用sqlite的命令行工具了
$sqlite3 -version
$3.9.2 2015-11-02 18:31:45 bda77dda9697c463c3d0704014d51627fceee328
或者直接运行,进入操作模式
$sqlite3
SQLite version 3.9.2 2015-11-02 18:31:45
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
使用.quit或者ctrl+d的组合键方式可以退出。
5、编译在ARM端上的版本
$cd arm
$./configure CC=arm-none-linux-gnueabi-gcc --host=arm-none-linux-gnueabi --prefix=/home/sunyu/sqlite/arm/sqlite-autoconf-3090200/taget
$make
$make install
CC指定的交叉编译工具,--host指定了平台,--prefix指定在sqlite-autoconf-3090200的taget目录下(这个目录是新建的($mkdir taget).
install完成后,会在taget目录下生成所需的库文件和头文件以及应用程序。
6、精简文件大小
经过上面的编译后,已经能将生成的文件放到开发板上使用的了,不过为了节省内存空间,可以对文件做一些处理,减小文件的大小。
$arm-none-linux-gnueabi-strip ./taget/lib/libsqlite3.so.0.8.6
$arm-none-linux-gnueabi-strip ./taget/lib/libsqlite3.a
$arm-none-linux-gnueabi-strip ./taget/bin/sqlite3
strip后:
sqlite3由2.4M降为720K
libsqlite3.so.0.8.6由2.4M降为694K
libsqlite3.a由2.7M降为652K
降的相当的多啊,不过削减了哪些东西还没验证,不清楚,这个先放着。
7、移植
接下来将交叉编译所安装的文件放到ARM板上,存放的目录就可以自己指定,可执行文件sqlite3是命令行工具,不依赖编译所生成的库,所以先单独放sqlite3到ARM板上。
我是通过tftp的方式将sqlite3下载到开发板上的所以下载好后,还需要赋予权限
#tftp -g -l sqlite3 -r sqlite3 192.168.1.249
sqlite3 100% |*******************************| 717k 0:00:00 ETA
#chmod +x sqlite3
测试运行方法和在PC上的一样。
#./sqlite -version
3.9.2 2015-11-02 18:31:45 bda77dda9697c463c3d0704014d51627fceee328
或者
#./sqlite
SQLite version 3.9.2 2015-11-02 18:31:45
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
8、测试程序
安装好后,测试下当前安装的sqlite是否能用,所以编写一段代码来测试一下,测试文件名为sqlite_test.c
<span style="font-size:18px;"><span style="font-size:14px;">#include <stdio.h>
#include <sqlite3.h>
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("sq.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
else
printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
sqlite3_close(db); //关闭数据库
return 0;
}</span></span>
9、PC端的测试$gcc sqlite_test.c -o test.out -lsqlite3
编译时需指定sqlite3的库。正常编译通过的话,会产生可执行文件test.out,执行该文件后会在当前目录下产生一个sq.db的数据库文件,并可以看到打印提示。
$./test.out
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
10、ARM端的测试
为了方便,我将第5步生成头文件和库文件复制到了PC端的/usr/local_arm下面去了,这样编译指定库与头文件就非常方便了,不用一串超长的命令了(还是很长。。)
$arm-none-linux-gnueabi-gcc sqlite_test.c -o test.out -lsqlite3 -L/usr/local_arm/lib -I/usr/local/include
上面的命令通过-L指定库文件的路径,通过-I指定头文件的路径。将编译后得到的test.out放入到ARM开发板上。
这时候,由于库文件还没有放入到ARM开发板上,所以此程序运行不了。
运行此程序会提示缺少libsqlite3.so.0
查看交叉编译得到的文件目录
$ll
drwxrwxr-x 3 sunyu sunyu 4096 12月 28 16:37 ./
drwxrwxr-x 6 sunyu sunyu 4096 12月 28 15:07 ../
-rw-r--r-- 1 sunyu sunyu 667232 12月 28 16:37 libsqlite3.a
-rwxr-xr-x 1 sunyu sunyu 995 12月 28 15:07 libsqlite3.la*
lrwxrwxrwx 1 sunyu sunyu 19 12月 28 15:07 libsqlite3.so -> libsqlite3.so.0.8.6*
lrwxrwxrwx 1 sunyu sunyu 19 12月 28 15:07 libsqlite3.so.0 -> libsqlite3.so.0.8.6*
-rwxr-xr-x 1 sunyu sunyu 710624 12月 28 16:37 libsqlite3.so.0.8.6*
可以看到,libsqlite3.so是libsqlite3.so.0.8.6的一个软链接
所以我们需要是libsqlite3.so.0.8.6,拷贝到ARM开发板的/usr/lib目录下,并建立软链接:
ARM开发板的/usr/lib下
#ln -s libsqlite3.so.0.8.6 libsqlite3.so
这样就可以运行test.out了,结果与PC上的一致。
其他的库暂时还没发现什么功能与之有关,所以暂时没动,在以后编译程序时用到就可以按照这种方式去放。
移植工作暂告一段落,以后就是学习使用SQlite这个数据库了。