Linux下GNU开发环境的安装、sqlite-3.3.6的编译及调用sqlite数...

来源:互联网 发布:码工助手和疯狂美工 编辑:程序博客网 时间:2024/06/09 20:56
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!

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肉包着智齿怎么办洗燥电影完整版 大腿内侧突然长黑痣越来越大怎么办 肚脐发炎、不脱落怎么办_妈网百科 老公出轨找个按摩的还不离婚怎么办 别人拿错钥匙装修好了房子怎么办 撞车后对方全责却不赔钱怎么办 我的世界国服客户端都是英文怎么办 下载的3d模型没有材质怎么办 写字时习惯把本子放歪该怎么办 被蚊子咬后留下硬疙瘩怎么办 吃冰镇西瓜导致呼吸不顺怎么办 吃冰镇西瓜嚓气导致呼吸不顺怎么办 在pr里面找不到做字幕的怎么办 电脑主机电源坏了接口坏了怎么办 邻居捡到我手机不给这种情况怎么办 婆婆总在儿子面前说媳妇坏话怎么办 试管准备取卵雌激素低该怎么办 订了火车票了忘记带身份证怎么办 网上买火车票忘记带身份证了怎么办 网上买的火车票忘记带身份证怎么办 深圳东站不卖站台票要送客怎么办 网吧刷身份证机器突然不好使怎么办 买了个衣服穿起来有点老气怎么办 美股主动退市股票钱怎么办 新注册的微信号被实名认证了怎么办 他出轨对我冷暴力孩子小怎么办 给情人发红包被老婆发现了怎么办一 情人和我出轨被他老婆发现了怎么办 情人老婆再次发我的存在怎么办 给情人还了账他老婆不承认怎么办 天堂1游戏限制IP登录次数怎么办 网易手机将军令绑不了太多号怎么办 当发生噩梦、梦魇等情况时该怎么办 出车祸后全保对方在家里来闹怎么办 轮胎正面凹槽被划了口子怎么办 机票已经买完了护照丢了怎么办 买完机票后护照丢了怎么办 填简历时籍贯写了汉怎么办 深圳公租房住满5年后怎么办 深圳公租房住满6年后怎么办 没单位了个人不想交社保怎么办