Linux下GNU开发环境的安装、sqlite-3.3.6的编译及调用sqlite数据库的C语言程序的编译运行-心得体会

Linux下GNU开发环境的安装、sqlite-3.3.6的编译及调用
sqlite数据库的C语言程序的编译运行-心得体会

我的目标是把sqlite数据库移植到Teaboard/ARM920-MX1嵌入式板子上,并保证其能正常使用。因此这几天一直在调试,今天终于将sqlite3.3.6版本在Linux下的Teaboard/ARM920-MX1的GNU开发环境中成功地编译。并且将自己改写的C语言程序test.c(该程序是由zieckey所写的test_sqlite.c稍微修改而成的)运行成功。感觉还是挺好的。下面我将整个安装调试的过程如实地记录下来,或许会对需要的朋友有所启示。
整个过程是在linux操作系统下完成的。使用Teaboard/ARM920-MX1的GNU开发环境,sqlite数据库是下载了最新的3.3.6版本。
(1)首先,Teaboard/ARM920-MX1的GNU开发环境的安装。
这是参照Teaboard/ARM920-MX1的安装手册来完成的。打开linux的终端之后,按照下面的步骤进行:
1、 创建一个安装目录。这里我创建的目录是:/usr/local/te。
# mkdir /usr/local/te
2、 解压所有的GUN包到目录/usr/local/te下。
先将下面所有的GUN包拷贝到路径/usr/local/te下:
te.resource.tbmx1.01.tar.gz
te.Linux-i686.common.05.tar.gz
te.Linux-i686.arm.04.tar.gz
以如下方式解压这些包:
# cd /usr/local/te //先进入该文件夹te
# tar zxpf te.resource.tbmx1.01.tar.gz
# tar zxpf te.Linux-i686.common.05.tar.gz
# tar zxpf te.Linux-i686.arm.04.tar.gz
3、 设置串口通信端口的读写权限。我使用的是串口1(com 1),因此设置/dev/ttyS0的读写权限。
# chmod 666 /dev/ttyS0
4、 设置环境变量(这一步我在最后一次重新安装时并没有执行)。
# export BD=/usr/local/te
# export GNUs=/usr
# export GNU_BD=$BD/tool/Linux-i686
# export GNUarm=$GNU_BD/arm-unknown-tkernel
# export GCC_EXEC_PREFIX=$GNU_BD/lib/gcc-lib/

这样,Teaboard/ARM920-MX1的GNU开发环境就安装完成了。为了测试其是否可以正确使用,我对其自带的基于Monitor的示例程序进行了编译。步骤如下:
/usr/local/te/# cd /usr/local/te/monitor/test/tbmx1
/usr/local/te/monitor/test/tbmx1# gmake
当编译成功,终端会重新显示:
/usr/local/te/monitor/test/tbmx1#
这就说明Teaboard/ARM920-MX1的GNU开发环境可以正常使用了。这个过程比较简单,也没遇到什么阻碍。

(2)编译sqlite-3.3.6.tar.gz。
这个编译过程是参考zieckey的帖子《sqlite3嵌入式数据库的ARM-Linux移置详解[原创]--->为初学者而作》而完成的。由于zieckey使用的是3.0.8版本,版本不同,中间的处理还是有些小的差异的。
特别,由于SQLite有一组TCL绑定的API,而一般也不怎么用的。所以可以去掉对Tcl的引用。当然,要是不想这样,也可以先安装ActiveTcl的(有关Tcl的知识,要感谢mistletoe相告)。这里我采用了去掉对Tcl引用的方法。不过我也成功地安装了ActiveTcl(之前装过一次,有问题,没有成功),我会在最后顺便给出ActiveTcl的正确安装方法。
由于是初次探索sqlite。关于对makefile文件的修改大多是(去掉Tcl引用)我自己凭感觉改的。也许有些地方并不需要改动的,我却进行了改动,会显得比较烦琐。如果哪位朋友有更好的修改方式,可以提出来,与大家分享。
下面是编译过程:
1、 解压。
打开linux系统下的终端,将下载下来的源码sqlite-3.3.6.tar.gz解压到指定的目录下。因
为在上一步安装GNU开发环境时,已经将gcc安装在/usr/local/te/tool/Linux-i686/bin目录下了。所以,这里我们将sqlite-3.3.6.tar.gz解压到/usr/local/te/tool/Linux-i686下,解压的时候,会自动创建一个文件夹sqlite-3.3.6. 先进入sqlite-3.3.6.tar.gz所在的目录下。
# tar zxvf sqlite-3.3.6.tar.gz /usr/local/te/tool/Linux-i686
# cd /usr/local/te/tool/Linux-i686/sqlite-3.3.6
2、 修改main.mk文件。
在目录sqlite-3.3.6下有一个main.mk文件,用linux下的文本编辑器打开后,找到有
TCCX的位置,将其中包含的tclsqlite.o都去掉(据说这是为了去掉Tcl的引用,在后面还要对makefile文件进行修改)。
保存修改。
3、 创建目录sqlite-3.3.6-arm-linux。
用于存放编译后的文件。
# mkdir /usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux
# cd /usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux
4、 设置交叉编译环境。
# Export PATH=/usr/local/te/tool/Linux-i686/bin:$PATH
5、 配置。
# ../sqlite-3.3.6/configure -–prefix=usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux
如果一切顺利的话,会在usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux目录下生成一些相关文件: config.log config.status libtool Makefile sqlite3.pc
6、 修改makefile文件。
① 找到以LIBTCL开头的行,将其注释掉(用符号#)。如下:
#LIBTCL = -L/usr/lib -ltcl8.3 -ldl -lieee -lm
② 找到以$(TOP)开头的行,将其注释掉(用符号#)。如下:
#$(TOP)/src/tclsqlite.c /
③ 找到以all开头的行,去掉其中的“$(HAVE_TCL:1=libtclsqlite3.la)”。
④ 找到以libtclsqlite3.la开头的行,将其相关的部分注释掉。如下:
#libtclsqlite3.la: tclsqlite.lo libsqlite3.la
# $(LTLINK) -o libtclsqlite3.la tclsqlite.lo /
# $(LIBOBJ) -L/usr/lib -ltclstub8.3 $(LIBPTHREAD) /
# -rpath $(libdir)/sqlite /
# -version-info "8:6:8"
⑤ 找到以tclsqlite.lo开头的行,将其相关的部分注释掉。如下:
#tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR)
# $(LTCOMPILE) -c $(TOP)/src/tclsqlite.c
⑥ 找到以testfixture$(TEXE):开头的行,去掉其中的“$((TOP)/src/tclsqlite.c”和“$( LIBTCL )”。
⑦ 找到以sqlite3_analyzer$(TEXE):开头的行,去掉其中的“$((TOP)/src/tclsqlite.c”和“libtclsqlite3.a”。
⑧ 找到以install:开头的行,去掉其中的“${HAVE_TCL:1=tcl_install}”。
⑨ 找到以tclsqlite-shell.lo:开头的行,将其相关的部分注释掉。如下:
#tclsqlite-shell.lo: $(TOP)/src/tclsqlite.c $(HDR)
# $(LTCOMPILE) -DTCLSH=1 -o $@ -c $(TOP)/src/tclsqlite.c
⑩ 找到以tclsqlite-stubs.lo:开头的行,将其相关的部分注释掉。如下:
#tclsqlite-stubs.lo: $(TOP)/src/tclsqlite.c $(HDR)
# $(LTCOMPILE) -DTCL_USE_STUBS=1 -o $@ -c $(TOP)/src/tclsqlite.c
最后一个是:
找到以tclsqlite3:开头的行,将其相关的部分注释掉。如下:
#tclsqlite3: tclsqlite-shell.lo .libsqlite3.la
# $(LTLINK) -o tclsqlite3 tclsqlite-shell.lo /
# libsqlite3.la $(LIBTCL)
7、 编译安装。
# cd usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux
#make
#make install
注明: "# make install" 这一步将会在
/usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux /lib 生成库文件。
# cd lib
# file libsqlite3.so.0.8.6 //查看文件信息
libsqlite3.so.0.8.6: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
此时生成的sqlite文件是还未strip过的。用strip处理过后,将去掉其中的调试信息,执行文件大小也将小很多。命令如下:
# strip libsqlite3.so.0.8.6

另外可以生成帮助文档,以便以后查询。
# make doc

这样,我们就编译成功了。
(3)编写一个C语言程序并运行。
现在我们来写个C程序,调用 sqlite 的 API 接口函数查询数据库中表的内容。并在该环境中运行。
首先,在sqlite编译成功之后,创建一个sqlite数据库和表,并插入数据。过程如下(在刚才的路径下):
# ./sqlite3 test.db
sqlite>
sqlite提示符出来,就表明成功啦。然后,
sqlite>create table users(name varchar(30) not null, age Integer not null);
sqlite>insert into users values(‘anny’, 20);
sqlite>select * from users;
anny|20 //这就是我输入的记录啦:)
sqlite>.exit //从sqlite数据库中退出,或者用命令.quit(注意前面有一个点)
然后,创建一个目录,用于存放将要编写的C语言程序。
#mkdir /usr/local/te/tool/Linux-i686/sqlite_test
#cd /usr/local/te/tool/Linux-i686/sqlite_test
现在,编写一个名为test.c的C语言程序,用Linux下的文本编辑器。保存在目录/usr/local/te/tool/Linux-i686/sqlite_test下。该程序是根据zieckey编写的test_sqlite.c改编的。源程序如下(修改的部分有注明):
#include <stdio.h>
#include <sqlite3.h>

int main( void)
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc){
printf("Can't open database/n"); //这里改了。要是按原先的,会提示stderr未定义,我不知道为什么。哪位朋友知道一定要告诉我哦。
sqlite3_close(db);
exit(1);
}
else printf("open test.db successfully!/n");
sqlite3_close(db);
return 0;
}

为了比较,给出zieckey所写的test_sqlite.c。

#include <stdio.h>
#include <sqlite3.h>

int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
if( rc ){
fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("open zieckey.db successfully!/n");

sqlite3_close(db); //关闭数据库
return 0;
}

最后编译程序test.c。
#gcc test.c –o test.out –lsqlite3 -L/usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux/lib -I/usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux/include
具体的细节问题可以参考zieckey所写的《sqlite3嵌入式数据库的ARM-Linux移置详解[原创]--->为初学者而作》。
编译成功之后,运行test.out。
#./test.out
若出现错误:./test.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory,说明运行沿着系统默认路径没有找到库文件。这时需要指定 libsqlite3.so.0 库文件的路径。

在shell下输入:

# export LD_LIBRARY_PATH=/usr/local/te/tool/Linux-i686/sqlite-3.3.6-arm-linux/lib:$LD_LIBRARY_PATH

再运行

# test.out
当提示:
#bash: test.out: command not found
时, 请以下面方式运行:
# ./test.out
正常情况就OK了!

open test.db successfully!

至此,在linux系统下的GNU环境中完成了sqlite的编译和C程序的编译运行。
此外,在开始的时候我说过,对于Tcl有两种处理,一是去掉Tcl的引用,二是安装ActiveTcl。前面讲了去掉Tcl引用的方法。现在顺便介绍一下ActiveTcl的安装(也许它对于很多人来说很简单,但是我在第一次安装的时候出了问题,我想也许还会有朋友会碰到该问题的,因此就写出来,希望对于象我一样刚接触Tcl的朋友会有帮助)。
① 下载最新版本ActiveTcl8.4.13.0.261555-linux-ix86.tar.gz。
② 解压。
# tar zxvf ActiveTcl8.4.9.0.121397-linux-ix86.tar.gz
③ 安装。
#cd ActiveTcl8.4.9.0.121397-linux-ix86
#./install.sh
如果用默认路径 /usr/local/ActiveTcl/ 安装,请在运行install.sh之前,编辑 /etc/profile 文件并加入以下内容
PATH=$PATH:/usr/local/ActiveTcl/bin
export PATH
我第一次出错就是在这里,没有对profile文件进行修改,因此在安装的时候,选择了默认路径/usr/local/ActiveTcl/之后点击next却怎么都过不去!
④ 建立链接
#rm /usr/bin/wish
#ln -s /usr/local/ActiveTcl/bin/wish /usr/bin/wish
注销后重新登陆,OK!

 
Logo

更多推荐