主题 : 让sqlite在mini2440上支持上下键回看历史记录 复制链接 | 浏览器收藏 | 打印
春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是UBUNTU好时节。。。。
级别: 侠客
UID: 24947
精华: 2
发帖: 63
金钱: 430 两
威望: 86 点
贡献值: 2 点
综合积分: 166 分
注册时间: 2010-07-16
最后登录: 2019-04-27
楼主  发表于: 2010-08-16 12:32

 让sqlite在mini2440上支持上下键回看历史记录

管理提醒: 本帖被 kasim 执行取消置顶操作(2012-02-26)
  我发现我越来越喜欢mini世界了,像上网本、ucos、busybox、minigui.... 他们周身都散发着小巧、精锐、可爱的气息,嵌入式SQlite同样让我着迷,他虽小却能支持绝大部分SQL语句,没有独立的服务器(嵌入在你的程序中),灵活度很大,零配置这一切让你的系统变得简单多了。
    废话不多说让解决问题来表现我对她的着迷吧。
    
    第一部分:pc问题
    在Ubuntu下我带着兴奋无比的心情运行我已编译好的sqlite3.7.0.1时冒出了这样一个问题:不支持上下键回看命令,这不得不让我经常打着相同且常常的查询语句,纠结!
    跑到sqlite下./configure,发现以下问题:
    checking for library containing tgetent... no
    checking for readline in -lreadline... no
    到网上一查readline:使用此库函数可以在输入时可以有像shell那样的快捷键功能,如回看命令等,毫无疑问问题出在这里,总算把问题揪出来了。
    赶紧用命令sudo apt-get install libreadline-dev或在新得利软件包亲自装起。
    在编译一切烦恼云消雾散!
    
    
    第二部分:移植到arm问题
    
    step 1:获得sqlite3的源代码:
此处使用的为SQLite版本为sqlite-3.7.0.tar.gz,可以通过以下方式获得此压缩包http://www.sqlite.org.

    step 2:解压压缩包:



    step 3:修改Makefile,main.mk文件:
与在PC环境下编译SQLite3不同,不能通过sqlite_arm目录下的configure脚本来生成 Makefile文件。而是必须手动修改Makefile文件。在sqlite目录下有一个Makefile范例文件Makefile.linux-gcc
首先通过下面的命令拷贝此文件并重命名为Makefile:
    cp Makefile.linux-gcc Makefile
利用gedit打开Makefile文件并手动修改Makefile文件的内容。
[root@localhost sqlite_arm]#gedit Makefile
找到Makefile文件中的下面这样一行(line    17):
    TOP = ../sqlite
将其修改为:
    TOP = .
找到下面这样一行(line  73):
    TCC = gcc -O6
将其修改为:
    TCC = arm-linux-gcc -O6
找到下面这样一行(line  81):
    AR = ar cr
将其修改为:
    AR = arm-linux-ar cr
找到下面这样一行(line  83):
    RANLIB = ranlib
将其修改为:
    RANLIB = arm-linux-ranlib
找到下面这样一行(line  86):
    MKSHLIB = gcc -shared
将其修改为:
    MKSHLIB = arm-linux-gcc -shared
找到下面这样一行(line  96):
    TCL_FLAGS = -I/home/drh/tcltk/8.4linux
将其修改为:
    #TCL_FLAGS = -I/home/drh/tcltk/8.4linux
注释掉下面这一行(line  103):
    LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl
将其修改为:
    #LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl
原则上,对Makefile的修改主要包括两个方面:首先是将编译器、归档工具等换成交叉工具链中的对应工具,比如:gcc换成arm-linux-gcc,ar换成ar-linux-ar,ranlib换 成arm-linux-ranlib等等;其次是去掉与TCL相关的编译选项,因为默认情况下,将会编译SQLite3的Tcl语言绑定,但是在移植到ARM-Linux的时候并不需要,因此将两个与TCL有关的行注释掉。关闭并保存Makefile文件。
然后修改main.mk文件,因为Makefile包含了这个文件。

找到以下两行将其注视掉:
    #tclsqlite.o:    $(TOP)/src/tclsqlite.c $(HDR)
    #            $(TCCX) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c
也就是把该行上的tclsqlite.o去掉。这样编译的时候将不会编译SQLite3的Tcl语言绑定。


    step 4:编译
自此,修改工作就完成了,接下来就可以开始编译SQLite3了,这通过make命令即可完成:
   出现以下错误:
  arm-linux-ranlib libsqlite3.a
arm-linux-gcc -O6  -DNDEBUG=1 -DHAVE_FDATASYNC=1 -I. -I./src -I.  -I./ext/rtree -I./ext/icu -I./ext/fts3 -I./ext/async  -o sqlite3                  \
        ./src/shell.c                                  \
        libsqlite3.a  
libsqlite3.a(mutex_unix.o): In function `pthreadMutexTry':
mutex_unix.c:(.text+0x30): undefined reference to `pthread_mutex_trylock'
libsqlite3.a(mutex_unix.o): In function `pthreadMutexAlloc':
mutex_unix.c:(.text+0xd8): undefined reference to `pthread_mutexattr_init'
mutex_unix.c:(.text+0xe4): undefined reference to `pthread_mutexattr_settype'
mutex_unix.c:(.text+0xf8): undefined reference to `pthread_mutexattr_destroy'
libsqlite3.a(os_unix.o): In function `unixDlSym':
os_unix.c:(.text+0x154): undefined reference to `dlsym'
libsqlite3.a(os_unix.o): In function `unixDlClose':
os_unix.c:(.text+0x914): undefined reference to `dlclose'
libsqlite3.a(os_unix.o): In function `unixDlOpen':
os_unix.c:(.text+0x930): undefined reference to `dlopen'
libsqlite3.a(os_unix.o): In function `unixDlError':
os_unix.c:(.text+0xcd0): undefined reference to `dlerror'
collect2: ld returned 1 exit status
make: *** [sqlite3] 错误 1


  没有此时应在TLIBS =上添加-ldl。
  
  再次make,出现以下错误:
  
  arm-linux-gcc -O6  -DNDEBUG=1 -DHAVE_FDATASYNC=1 -I. -I./src -I.  -I./ext/rtree -I./ext/icu -I./ext/fts3 -I./ext/async  -o sqlite3                  \
        ./src/shell.c                                  \
        libsqlite3.a  -ldl
libsqlite3.a(mutex_unix.o): In function `pthreadMutexTry':
mutex_unix.c:(.text+0x30): undefined reference to `pthread_mutex_trylock'
libsqlite3.a(mutex_unix.o): In function `pthreadMutexAlloc':
mutex_unix.c:(.text+0xd8): undefined reference to `pthread_mutexattr_init'
mutex_unix.c:(.text+0xe4): undefined reference to `pthread_mutexattr_settype'
mutex_unix.c:(.text+0xf8): undefined reference to `pthread_mutexattr_destroy'
collect2: ld returned 1 exit status
make: *** [sqlite3] 错误 1

此时在TLIBS =上添加-lpthread。
最终编译通过。succefully!
  
  
    step 5:为平台安装sqlite3以及构建 sqlite程序的交叉编译环境:
编译完成之后,将在sqlite_arm目录下生成一下文件:
库函数文件:    libsqlite3.a
头文件:        sqlite3.h
应用程序;    sqlite3

    注意:此时生成的sqlite文件是还未strip过的,你可以使用命令“file sqlite3”查看文件信息。用strip处理过后,将去掉其中的调试信息,执行文
    件大小也将小很多。命令如下:
                arm-linux-strip sqlite3

此时将sqlite3应用程序拷贝到文件系统的系统路径 bin目录下,这样就可以在嵌入式开发平台上使用SQLite了。

再将  1.libsqlite3.a 复制到/usr/local/arm/4.3.2/lib/下;
     2.sqlite3.h 复制到 /usr/local/arm/4.3.2/include 下;
  这样就可以用下面命令交叉差编译含sqlite API的程序了:
     arm-linux-gcc sqlite.c -o sqe -L/usr/local/arm/4.3.2/lib -I/usr/local/arm/4.3.2/include -ldl  -lpthread -lsqlite3
    
    小诀窍:因为在安装arm-linux-gcc时已经将/usr/local/arm/4.3.2/arm-none-linux-gnueabi和/usr/local/arm/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2路径加入到环境变量故不需用参数-I 和-L指定头文件和库文件路径,arm交叉编译器会自动到上面两个路径下寻找,所以把sqlite的头文件和库文件拷贝到上面的其中一个路径下就仅仅用下面条命令就可解决:
          arm-linux-gcc sqlite.c -o sqe   -ldl  -lpthread -lsqlite3
  
   到此可以在mini2440上运行sqlite了,也可编译包含sqlite函数的程序了。
  
   以上的方法都是从网上原原本本的贴了过来也不知是哪位大侠的杰作,在此感谢了(要继续下面的步骤前面的过程是必须的)。以下就是我自己摸索的方法了:
   话又说回来高兴了一阵子又回到我最开始的状况:不能支持上下键回看命令!
   具体做法按照以下命令执行:
    step 1:./configure --host=arm-linux  --prefix=你要安装的路径
    step 2:make
    出现下面错误:
    /tmp/cckvERyM.o: In function `one_input_line':
    /home/phil/sqlite-3.7.0.1/./src/shell.c:379: undefined reference to `readline'
    /home/phil/sqlite-3.7.0.1/./src/shell.c:379: undefined reference to `readline'
    /home/phil/sqlite-3.7.0.1/./src/shell.c:381: undefined reference to `add_history'
    /tmp/cckvERyM.o: In function `main':
    /home/phil/sqlite-3.7.0.1/./src/shell.c:2613: undefined reference to `read_history'
    /home/phil/sqlite-3.7.0.1/./src/shell.c:2617: undefined reference to `stifle_history'
    /home/phil/sqlite-3.7.0.1/./src/shell.c:2618: undefined reference to `write_history'
    collect2: ld returned 1 exit status
    make: *** [sqlite3] 错误 1
    说明readline库函数没有!
    
    下载readline-5.2
  执行下面命令:
    ./configure --host=arm-linux  prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi
    make
    make install
    很顺利的把readline库函数编译和安装完。
    
    于是跑到sqlite源代码下编译一番还是原来的问题,既然库函数都装好了怎么还是这样,难道没加参数-lreadline?查看一下Makefile文件发现TLIBS = -lpthread,于是在后面手动加上了-lreadline,当时发现这个错误我心中窃喜,了定却是:
   /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `PC'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetflag'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetent'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `UP'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tputs'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tgoto'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetnum'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `BC'
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
make: *** [sqlite3] 错误 1

   于是到网上查找,说是readline库依赖ncurses库,是由于没有链接 ncurses库,只要加上 -lncurses就可以了.于是到网上下载了ncurses-5.5,按照下面的命令顺利的完成了ncurses库的移植:
    -->./configure --host=arm-linux  --prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi
    -->make
    -->make install
  
   再跑到sqlite下到找到TLIBS = 到后面添上-lncurses ,最终为TLIBS = -lpthread -lreadline -lncurses;
  
   终于编译通过,把bin和lib文件拷贝到arm开发板上运行终于搞定!
   为此搞了一个通宵,非常值得!
  
   以上有什么错误恳请大家点出来,里面能懂的烦大家介绍介绍,如ncurses库,readline库,小的确实不太清楚。
[upload=1] [upload=2]  
[ 此帖被小荷尖尖在2010-08-16 17:29重新编辑 ]
级别: 骑士
UID: 14324
精华: 0
发帖: 160
金钱: 810 两
威望: 162 点
贡献值: 0 点
综合积分: 320 分
注册时间: 2010-02-06
最后登录: 2015-06-02
1楼  发表于: 2011-06-22 15:14
测试了下可以,不过有个地方需注意下:
此处:
找到Makefile文件中的下面这样一行(line    17):
    TOP = ../sqlite
将其修改为:
    TOP =
此处的top是路径必须写清楚,不然main.mk会出错。