关于SQLite3 编译及交叉编译的一些问题
from : http://blog.sina.com.cn/s/blog_5f2e119b0101ibwn.html
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
OK,现在执行一下sqlite3,完全没有问题了(如果前面没有安装libreadline和libncurses5-dev库,按上下方向键就没有显示历史命令记录这个实用功能),同时其开发库也已经安装到系统里了。
下面是交叉编译sqlite所有相关文件的问题。
由于是交叉编译,所以一些相关的依赖库,比如libreadline和libncurses就不能直接安装到系统里面了(安装了也没用不会被交叉编译器识别),而是应该安装到交叉编译器的目录中。 先分别去下面这两个地方下载libreadline和ncurses的源码包(之所以要安装ncurses库是因为libreadline依赖于它,而且很多linux的软件都会用到这个库),注意是下载.tar.gz为扩展名的包,一般都是下载最新版的。 http://ftp.gnu.org/gnu/readline/ http://ftp.gnu.org/gnu/ncurses/ 分别交叉编译这两个包:
sudo ./configure --host=arm-linux --prefix=/opt/ sudo make sudo make install
--host接的是arm的交叉编译器的名称,--prefix接的是编译好之后安装到的路径,这里建议不要直接安装到交叉编译器的路径,而是安装到其它地方,等安装完之后到目标目录确认一下之后再手动拷到交叉编译器的目录里面去。
待两个包编译安装完之后,还要手动拷到交叉编译器的路径里面去,这里我以安装在/usr/local/arm/3.4.6目录里面的3.4.6版本的交叉编译器为例。进入到刚才编译安装好的那两个包的目录,里面应该有bin include share lib等目录,在那个目录里面,执行如下命令
sudo cp -pR * /usr/local/arm/3.4.6/arm-linux
这里有两个个人认为需要注意的问题。 1. cp -p的参数是复制文件的属性、拥有者、符号链接等所有属性,而-R是递归复制,也就是拷贝下面的所有目录和文件过去。而目标目录并不是/usr/local/arm/3.4.6,而是其下面的arm-linux这个目录,需要注意一下。当然3.4.6版本的交叉编译器是这样子的,别的版本的交叉编译器请自行参考。 2. 这两个库不仅要安装到交叉编译器里面去,更是建议把它安装到开发板的根文件系统里面去,因为个人的2440的根文件系统是用nfs挂在pc上的,所以只要用cp -pR把所有东西直接拷过去就行了,其它方法做的根文件系统请自行想办法解决。至少需要把libreadline的库拷到根文件系统里面去,不然交叉编译好的sqlite3会因为缺少libreadline的库而拒绝执行。
在上面的工作都准备好之后,进入以sqlite3-autoconf的目录里面去,执行:
sudo ./configure --host=arm-linux --prefix=/opt/sqlite3
这个configure的参数跟上面的编译readline和ncurses是一样的意思,跟上面在pc上configure之后输出的信息一样,也要找到有-lncurses和-lreadline且readline为yes的时候,才能正常启用上下键调出命令记录的功能。
然后执行 sudo make sudo make install
安装完成之后,再把安装目录里面的所有文件都拷到开发板的根文件系统里面去,用minicom连接到2440的linux,执行一下sqlite3这个程序,如果你是按上文来做的话,应该不会有问题,而且可以支持上下键显示历史命令记录这个实用功能了。
另外还有一个比较有意思的问题,如果不给交叉编译器加上ncurses和readline这两个库的支持,直接用上面的configure来生成makefile,make之后将会有有个错误无法通过编译,只能手动去改makefile,好像是Makefile有个地方多了个斜杠,把那个斜杠去掉之后就可以编译通过了。但是把交叉编译器打上ncurses和readline库之后,这个错误就不会再出现了。
再下面就是做sqlite3应用开发的编译上的小问题了。
在pc上写完代码之后编译的时候使用的选项应该是这样的: gcc -o name name.c -lsqlite3 最后那个-lsqlite3是引用sqlite3的开发库。
而交叉编译的时候就有些不一样了: arm-linux-gcc -o name name.c -I /opt/sqlite3/include -L /opt/sqlite3/lib -lsqlite3 -I接的是交叉编译后安装的arm版的sqlite3目录里面的头文件,而-L则是包含的库文件。
这样的编译选项编译之后,拷到开发板上去,执行,OK!
关于SQLite3 编译及交叉编译的一些问题的更多相关文章
- sqlite3编译
1.sqlite3编译: 1.PC版: 1.解压: tar xvf sqlite-autoconf-3140100.tar.gz cd sqlite-autoconf-3140100/ 2.检查配置 ...
- sqlite3编译与查询
1.sqlite3 http://www.sqlite.org/ 下载 wget http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip ...
- 从头编译ARM交叉编译环境
首先Cygwin需安装基本的命令 例如make binutils gcc 还有diffutils 没有他会报找不到cmp命令 这些都可以在setup.exe中找到 编译gcc时,需要注意一个原则:不要 ...
- linux 下 openssl 编译和交叉编译
此随便记录一下编译openssl时遇到的各种问题以及解决办法. 点击此处下载 OpenSSL(version-1.0.1e) linux 64位系统编译32位版本: setarch i386 ./Co ...
- edgex0.7.1_1.0.1的X86编译和交叉编译
一. X86编译 1. 安装zeromq库 根据setup script安装: wget https://github.com/zeromq/libzmq/releases/download/v4.2 ...
- Linux 编译与交叉编译
在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文 ...
- Linux之Qt利用Sqlite静态编译库(转)
参考:http://www.linuxidc.com/Linux/2011-11/47465.htm sqlite3编译安装 ------------------------arm版--------- ...
- Cocos移植到Android的一些问题-SQLite3数据库移植问题
首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一 ...
- Sqlite,libevent,openssl,mosquito交叉编译
一.设置交叉编译环境 在makefile所在目录(或源代码根目录)打开终端. 在终端中设置交叉编译所需的临时环境变量(也可写到配置文件中设置为全局环境变量),其中交叉编译工具链的名称和目录需要根据实际 ...
随机推荐
- POJ2823_Sliding Window
以前也碰到过这种类型的题目,以前好像做出来过,但是忘记了,这次又坑了. 题目很简单,对于从前到后每一个连续的长度为k的数字,求出这段数字中的最大的数字和最小的数字. 一开始我用离散化+树状数组来更新和 ...
- CSS预处理语言-less 的使用
Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. Less 可以运行在 Node 或浏览器端. Less的编译处理 作为一 ...
- 【刷题】BZOJ 3172 [Tjoi2013]单词
Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N ...
- 【ZJOI2005】沼泽鳄鱼 题解报告
题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...
- 洛谷 P4721 【模板】分治 FFT 解题报告
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...
- uoj 36 玛里苟斯
[清华集训2014]玛里苟斯 - 题目 - Universal Online Judge k=1,2,3,4,5各占20pts是提示 应当分开考虑 k=1 拆位,如果第i位有1,则有1/2的概率xor ...
- HDU--1874
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 分析:SPFA|Dijkastra. #include<iostream> #inc ...
- 大自然的搬运工:Ubuntu环境下gedit的一些个简单配置
gedit是Ubuntu默认的文本编辑器,个人觉得还是不错的,用它来编程写一些小的demo也很方便,原谅我比较菜,vim用起来感觉打字速度真的很慢呀. 下面对gedit做一些简单配置,方便编程. 一. ...
- windows环境下封装条件wait和signal
linux 环境有提供好的pthread_cond_wait() 和 phread_signal().pthread_broadcast() windows需要自己封装,利用semophore控制线程 ...
- discuz更换域名,登录不了解决
准备工作 :因为域名更换了,因此原域名就不能再进后台了,请申请好新域名,并正确备案,让机房添加白名单,重新解析,重新绑定空间..... 完成一系列工作后,进入DZ程序修改. ------------- ...