关于SQLite3 编译及交叉编译的一些问题



    SQLite3 (
http://www.sqlite.org )是一个非常强大的小型开源数据库软件,特别嵌入到一些软件中存储数据,当然,移植到嵌入式系统上也是非常有必要的。众所周知的Symbian,Android, IOS这几大移动平台都是使用的sqlite作数据存储,使用SQLite的厂商包括Adobe, Airbus, Apple, Dropbox, Mozilla, GE, Google, McAfee, Microsoft, PHP, Python, Toshiba等等。目前SQLite的赞助商包括Oracle, Adobe, Mozilla等。官网的介绍在这里 http://sqlite.org/about.html

    优点:
        1、体积非常小巧,shell版的可执行文件仅600K左右,所有运行库加起来也不过3M多。
        2、性能很好,和mysql相比性能完全不在其之下。
        3、整个数据库存储在一个单一的文件里,备份恢复都非常容易。
        
    缺点:
        对于并发的支持不好,其对于数据库的读写是完全加锁的。




    本文中系统平台为ubuntu 12.04.1 LTS,开发板为s3c2440实验箱,使用的交叉编译器为3.4.6版。

    在ubuntu虽然可以通过
        sudo apt-get install sqlite3
    来安装源里面的sqlite3,不过却不是最新版,之所以不用源里面安装的版本不仅仅是因为那个版本有点老,而且有个很关键的问题,sqlite3只有在3.7.11之后的版本才支持insert into table_name values(),(),()这种方式来一次性插入多条数据,而源里面的版本是3.7.4的版本并不支持这个特性,所以用起来就很不方便,故选择了自己编译。本文以官网最新的3.7.14.1版为例。


    sqlite3官网提供了两种源代码的方式,一种叫作amalgamation,另外一种叫作autoconf,这两种源码包有点不一样。amalgamation的源码包是把sqlite的所有源文件都集成到了sqlite3.c这一个文件里面去,而且这个包只适合单独编译出一个shell版本的sqlite3,它并不会编译出linux里面常见的开发库(也就是基于sqlite3编写的软件必须要依赖的sqlite3库)。而autoconf版就很明显了,是使用linux上面常见的./configure make make install方式来编译sqlite3的,可以编译出所有需要的依赖库。虽然sqlite官方建议使用amalgamation包,但经过个人测试,使用autoconf的包对于sqlite开发者来说是必须的,对于ARM的交叉编译来说就更是如此了。



    Amalgamation包编译shell版sqlite3:
        解压了下载下来的amalgamation的压缩包之后,进入目录,执行

            gcc -o sqlite3 shell.c sqlite3.c -lpthread -ldl

        大约要10到20秒时间即可编译出来一个可用的shell版sqlite3。之所以不推荐使用amalgamation包,是因为使用这个包始终无法编译出支持上下键选择历史命令记录的功能,即使是安装了libreadline-dev包并且加上-lreadline编译参数也不可以,如有人能告诉我原因,不甚感激。



    Autoconf包编译sqlite3及其开发库:
        在编译之前,还需要安装libreadline库,用以实现sqlite3按上下方向键实现重现历史命令记录的功能,此包不大,500k左右。(当然,ubuntu下面做开发必须要安装的build-essential, libncurses5-dev, autoconf, automake这些基本包就不说了)

            sudo apt-get install libreadline-dev

        安装好libreadline之后,执行如下命令编译并安装sqlite及开发库:

            sudo ./configure
            sudo make
            sudo make install

        在执行完./configure之后,注意观察一下输出的结果,在靠后的部分,可以看到这样的输出:
            checking for library containing tgetent... -lncurses
            checking for library containing readline... -lreadline
            checking for readline... yes
        
        如果没找到lncurses和lreadline这两个库,readline肯定就是no了,多半编译完成之后的sqlite3不会支持按上下键调出历史命令记录这个实用功能。
        执行完这三条命令之后,sqlite3就已经被默认安装到了/usr/local/bin里面去了,但是还没完呢,如果在终端直接执行一下sqlite3,多半会报错,类似于这样:

            SQLite header and source version mismatch
            2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e
            2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb

        这个问题是因为ubuntu里面原来自带了一个老版的sqlite运行库,这个库由一个库文件和一个符号链接组成,位于/usr/lib/i386-linux-gnu目录,分别是libsqlite3.so.0.8.6和一个符号链接到它的libsqlite3.so.0,由于上面进行的autoconf包的sqlite3并不是静态编译,所以就会出现库不匹配的情况而程序拒绝执行的问题了。
        由于不知道系统自带的那个老版的sqlite库还会不会有用,我们就留着它:
            mv /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6_bak
        然后把刚才编译好的autoconf包里面的这个库复制过去:
            cp .libs/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu

转载于:https://www.cnblogs.com/iwantcomputer/archive/2012/12/11/8489830.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值