• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 让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: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2010-08-16 13:01
不错,感谢分享你的经验和乐趣。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
QT 的布局怎么搞?
级别: 侠客
UID: 5575
精华: 0
发帖: 81
金钱: 485 两
威望: 193 点
贡献值: 0 点
综合积分: 162 分
注册时间: 2009-04-29
最后登录: 2013-12-02
2楼  发表于: 2010-08-16 14:39
我记得sqlite3编译出for ARM9 Linux的可执行文件很简单啊,不用修改什么东东。只需要在
./configure  --help
中指定交叉编译器即可。
SBC2410+8' LCD
mini2440+NEt 3.5'
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2010-08-16 15:10
只要是DIY的,我都支持:)我这次一定要再滥用一次我的版主权力,加精!
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是UBUNTU好时节。。。。
级别: 侠客
UID: 24947
精华: 2
发帖: 63
金钱: 430 两
威望: 86 点
贡献值: 2 点
综合积分: 166 分
注册时间: 2010-07-16
最后登录: 2019-04-27
4楼  发表于: 2010-08-16 17:24
引用第2楼backup于2010-08-16 14:39发表的  :
我记得sqlite3编译出for ARM9 Linux的可执行文件很简单啊,不用修改什么东东。只需要在
./configure  --help
中指定交叉编译器即可。

谢谢你提醒,我一开始就是按照网络的办法这样搞的。其实要编译sqlite3就用下面条命令就可,不需要第二部分的step 3:
./configure --host=arm-linux  --prefix=你要安装的路径   --disable-tcl   --disable-  --disable-readline 就可避免我所说的:
    checking for library containing tgetent... no
    checking for readline in -lreadline... no
但是肯定不能支持上下键回看历史记录,因为屏蔽掉了readline的功能,不屏蔽掉就无法通过。所以我下面的步骤还是有所必要的,我想arm交叉编译的库里面没有自带readline库和ncurses库吧。还有就是使用上面(step 3)编译的是静态库,所以只要带着sqlite3这个可执行程序跑就可以了,我想这网友也是为了方便着想吧,但是消耗了内存(就编译出来的sqlite3就有530多K,相比42K大多了)。

    最后谢谢斑竹kasim对DIY的支持!
级别: 新手上路
UID: 12036
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
贡献值: 0 点
综合积分: 76 分
注册时间: 2009-12-27
最后登录: 2011-06-01
5楼  发表于: 2010-08-22 09:56
3.7.0.1源码包里面的Makefile和main.mk并没有啊!!
春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是UBUNTU好时节。。。。
级别: 侠客
UID: 24947
精华: 2
发帖: 63
金钱: 430 两
威望: 86 点
贡献值: 2 点
综合积分: 166 分
注册时间: 2010-07-16
最后登录: 2019-04-27
6楼  发表于: 2010-08-22 16:52
引用第5楼xntop于2010-08-22 09:56发表的  :
3.7.0.1源码包里面的Makefile和main.mk并没有啊!!


我估计你下的不是完整版
你可从这个地址下载(解压缩后有15MB):
http://www.sqlite.org/sqlite-3.7.0.1.tar.gz
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
贡献值: 8 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
7楼  发表于: 2010-10-08 14:23
顶个,学习了
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
贡献值: 8 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
8楼  发表于: 2010-10-08 15:36

 回 楼主(小荷尖尖) 的帖子

楼主,从你的下载地址下载后./configure后出现以下错误,是什么原因?
[root@localhost sqlite-3.7.0.1]# make
tclsh ./tool/mksqlite3h.tcl . >sqlite3.h
/bin/sh: tclsh: command not found
make: *** [sqlite3.h] 错误 127
[root@localhost sqlite-3.7.0.1]# make
gcc  -g -o mkkeywordhash -DSQLITE_OMIT_LOAD_EXTENSION=1  ./tool/mkkeywordhash.c
./mkkeywordhash >keywordhash.h
gcc  -g -o lemon ./tool/lemon.c
cp ./src/lempar.c .
cp ./src/parse.y .
rm -f parse.h
./lemon -DSQLITE_OMIT_LOAD_EXTENSION=1  parse.y
mv parse.h parse.h.temp
gawk -f ./addopcodes.awk parse.h.temp >parse.h
cat parse.h ./src/vdbe.c | gawk -f ./mkopcodeh.awk >opcodes.h
./libtool --mode=compile --tag=CC arm-linux-gcc   -g -O2 -DSQLITE_OS_UNIX=1 -I. -I./src -D_HAVE_SQLITE_CONFIG_H -DNDEBUG   -DSQLITE_THREADSAFE=1 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 -DSQLITE_OMIT_LOAD_EXTENSION=1   -DSQLITE_TEMP_STORE=1 -c ./src/alter.c
libtool: compile:  arm-linux-gcc -g -O2 -DSQLITE_OS_UNIX=1 -I. -I./src -D_HAVE_SQLITE_CONFIG_H -DNDEBUG -DSQLITE_THREADSAFE=1 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_TEMP_STORE=1 -c ./src/alter.c  -fPIC -DPIC -o .libs/alter.o
In file included from ./src/alter.c:15:
./src/sqliteInt.h:426: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'i64'
./src/sqliteInt.h:427: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'u64'
In file included from ./src/sqliteInt.h:638,
                 from ./src/alter.c:15:
./src/btree.h:58: error: expected declaration specifiers or '...' before 'sqlite3'
春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是UBUNTU好时节。。。。
级别: 侠客
UID: 24947
精华: 2
发帖: 63
金钱: 430 两
威望: 86 点
贡献值: 2 点
综合积分: 166 分
注册时间: 2010-07-16
最后登录: 2019-04-27
9楼  发表于: 2010-10-16 21:08

 回 8楼(xphyym) 的帖子

呵呵,好久没来了,我当时没有遇到你这个问题,当我现在回帖时很高兴你一解决了,
  若大家还有像   xphyym兄的问题可参见:
    http://www.aiothome.net/read.php?tid-8235.html

此是 xphyym兄的解决办法
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go