SQlite在PC和ARM上的编译移植

    SQlite是一个开源的嵌入式数据库,至于它的特性和性能,这里就不介绍了,google上很多介绍了。SQlite是很受欢迎的一个小型的数据库,现在手机上的两大操作系统ios和android上都是用它,足以见它的分量了吧。

    PC端的平台是ubuntu 11.04 . ARM的平台是S3C6410。

    SQlite的官网是www.sqlite.org,官网上的下载页面已经有很多官方编译好的各个操作系统版本的可执行文件和库文件,可以直接使用了。而且在ubuntu中也可以简单的通过sudo apt-get install sqlite3来安装。下面来介绍下通过源码编译的方法来移植到不同的平台上。

    首先下载源码,在官方的download页面上有最新的下载,我移植的时候当前最新的版本是3.7.14.1。 下载地址为:http://www.sqlite.org/sqlite-autoconf-3071401.tar.gz

 

1. 解压源码包:

$ tar -zxvf sqlite-autoconf-3071401.tar.gz

$ cd sqlite-autoconf-3071401

 

2. 由于我们要移植两个版本,而且在配置和编译安装的时候会参数一些文件,为了管理方便先建立几个目录

$ mkdir build

$ cd build

$ mkdir x86 arm

 

3. 编译X86的版本

$ cd x86

$ ../../configure --prefix=/usr/local
$ make
$ sudo make install
$ sudo ldconfig

上面配置命令中,--prefix选项后面的路径是编译安装后目标安装的位置,这个位置你可以自己定义。

安装完成后,产生的文件会存放在你配置时指定的目录.。bin目录下放的是sqlite3的可执行文件,lib目录下放的是库文件,include目录下放的是头文件,编译程序的时候有用。

由于库安装的路径可能不在系统的默认路径上,而引起出现”SQLite header and source version mismatch“这个错误,所以用ldconfig命令来解决。

 

4. 完成以上的步骤后就移植完了,可通过命令来查下

$ sqlite3 -version

$ 3.7.14.1 2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb

或者通过命令来操作数据库

$ sqlite3 test.db

 

5. 下面来将sqlite移植到arm上面

$ cd ../arm

$ ../../configure CC=/opt/arm-2008q3/bin/arm-linux-gcc --host=arm-linux --prefix=/home/ligh/Apps/sqlite-autoconf-3071401/build/arm/target

$ make

$ make install

上面配置中,CC指定了ARM的编译工具链,--host指定了平台,安装路径为当前目录的target目录下。install完成后,会在target目录下生成我们所需的执行文件,库文件和头文件等。

 

6. 经过上步所得到的文件其实已经可以放到ARM板上使用的了,但为了节省ARM板的存储空间,我们先对该文件瘦身,去掉没用的调试信息。

$arm-linux-strip ./target/lib/libsqlite3.so.0.8.6
$arm-linux-strip ./target/lib/libsqlite3.a
$arm-linux-strip ./target/bin/sqlite3

strip后,原来文件的大小由4M多减少到1M多,相当给力。

 

7. 完成所有的移植操作后,接下来做的就是把所得到的文件放到ARM板上了。为了跟刚才PC存放的位置相同,我是把相应的文件放到ARM板上/usr/local目录相对应的目录下面的,这个可以自己决定放哪。 把/bin/sqlite3拷贝到ARM板上的/usr/local/bin下,把/lib下的所有文件拷贝到ARM板/usr/local/lib目录下。接下来在ARM板上测试下是否能运行,测试方法跟PC上的一样。

S3C6410# /usr/local/bin/sqlite3 -version

S3C6410# 3.7.14.1 2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb

或者

S3C6410#/usr/local/bin/sqlite3  test.db

 

8. 下面写一段代码来测试刚移植的sqlite是否可用。

#include
#include
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;
}

 

9. 编译成PC版本:

$ gcc  sqlite_test.c -o test.out -lsqlite3

在此处加需要加上lsqlite3选项来指明使用了sqlite3的库。正常来说编译通过,产生test.out的执行文件。执行该文件后会在当前目录下产生一个sq.db的数据库文件,并可看到打印提示:

$ ./test.out

You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^


 

10. 编译成ARM版本:

为了方便,我把刚才第5步编译得到的ARM版本的头文件和库文件都放到了PC端的/usr/local/sqlite3_arm目录下了,这样交叉编译ARM版本的程序时需要指定头文件和库文件的路径。

$ arm-linux-gcc sqtest.c -o db.out -lsqlite3 -L/usr/local/sqlite3_arm/lib -I/usr/local/sqlite3_arm/include

上面命令中通过-L指定库文件的路径,通过-I指定头文件的路径,编译工具链记得要用ARM版的交叉工具链哦。将编译得到的db.out文件放到ARM的文件系统上,运行结果跟PC的一致。

 

自此,所有工作都完成了,接下来就是要深入学习SQlite这个数据库的使用了。

 

你可能感兴趣的:(SQlite在PC和ARM上的编译移植)