对SQLite-3.3.8(或者SQLite3.3.12)进行交叉编译,并移植到ARMS3C2410的过程:
要将SQLite3.3.8(或者SQLite-3.3.12)移植到ARM2410开发板上,除了要有底层操作系统的支持外,还必须要有相应的交叉编译 工具链。由于ARM2410开发板采用的是ARM-Linux作为底层操作系统,因此需要首先安装ARM-Linux工具链。
1.交叉编译环境建立:
安装cross-2.95.3.tar.bz2交叉编译工具到/usr/arm-linux目录下。
解压sqlite-3.3.8到/home/sqlite-3.3.8,并创建文件夹
cd /home/sqlite-3.3.8
mkdir sqlite-arm-linux
1.交叉编译环境建立:
安装cross-2.95.3.tar.bz2交叉编译工具到/usr/arm-linux目录下。
解压sqlite-3.3.8到/home/sqlite-3.3.8,并创建文件夹
cd /home/sqlite-3.3.8
mkdir sqlite-arm-linux
2、修改/home/sqlite-3.3.8目录下的configure文件的部分内容
这样可以让configure不去检查你的交叉编译环境,否则会出现如下同样的错误
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling,将不能生成Makefile文件.
20420行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20446行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
cd /home/sqlite-3.3.8/sqlite-arm-linux
../configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
生成了Makefile文件,这些将在make时用到.
这样可以让configure不去检查你的交叉编译环境,否则会出现如下同样的错误
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling,将不能生成Makefile文件.
20420行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20446行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
cd /home/sqlite-3.3.8/sqlite-arm-linux
../configure --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux
生成了Makefile文件,这些将在make时用到.
3、将Makefile文件中如下语句
BCC = arm-linux-gcc -g -O2
改成:
BCC = gcc -g -O2
BCC = arm-linux-gcc -g -O2
改成:
BCC = gcc -g -O2
4、设置交叉编译环境
export PATH=/usr/arm-linux/arm/2.95.3/arm-linux/bin:$PATH
设置config_TARGET_CC和config_BUILD_CC两个环境变量。config_TARGET_CC是交叉编译器,config_BUILD_CC是主机编译器:
export config_BUILD_CC=gcc
export config_TARGET_CC=arm-linux-gcc
export PATH=/usr/arm-linux/arm/2.95.3/arm-linux/bin:$PATH
设置config_TARGET_CC和config_BUILD_CC两个环境变量。config_TARGET_CC是交叉编译器,config_BUILD_CC是主机编译器:
export config_BUILD_CC=gcc
export config_TARGET_CC=arm-linux-gcc
5、编译并安装
make && make install
这里如果不出意外,将不会出现错误,那么库文件已经生成在
/home/sqlite-3.3.8/sqlite-arm-linux/lib目录下,
库文件已经生成在为了减小执行文件大小可以用strip处理,去掉其中的调试信息。
arm-linux-strip libsqlit3.so.0.8.6
make && make install
这里如果不出意外,将不会出现错误,那么库文件已经生成在
/home/sqlite-3.3.8/sqlite-arm-linux/lib目录下,
库文件已经生成在为了减小执行文件大小可以用strip处理,去掉其中的调试信息。
arm-linux-strip libsqlit3.so.0.8.6
file sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
由此可知,此时生成的sqlite文件是还未strip过的。执行命令arm-linux-strip, 去掉其中的调试信息,这样文件将减少很多。(这一步不知道为什么我实现不了,但是不影响软件使用)
arm-linux-strip sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
由此可知,此时生成的sqlite文件是还未strip过的。执行命令arm-linux-strip, 去掉其中的调试信息,这样文件将减少很多。(这一步不知道为什么我实现不了,但是不影响软件使用)
arm-linux-strip sqlite3
再次用file命令查看sqlite3的信息:
file sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
这就是在开发板上可以直接运行的可执行文件。
file sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
这就是在开发板上可以直接运行的可执行文件。
6、移植
需要注意:
拷贝是需要加上 –arf选项,因为libsqlite3.so,libsqlite3.so.0是链接到libsqlite3.so.0.8.6的。
cd /home/sqlite-3.3.8/sqlite-arm-linux/lib
cp –arf libsqlite3.so libsqlite3.so.0. libsqlite3.so.0.8.6 /usr/qt-sqlite/lib
cd /home/sqlite-3.3.8/bin
cp sqlite3 /usr/qt-sqlite
需要注意:
拷贝是需要加上 –arf选项,因为libsqlite3.so,libsqlite3.so.0是链接到libsqlite3.so.0.8.6的。
cd /home/sqlite-3.3.8/sqlite-arm-linux/lib
cp –arf libsqlite3.so libsqlite3.so.0. libsqlite3.so.0.8.6 /usr/qt-sqlite/lib
cd /home/sqlite-3.3.8/bin
cp sqlite3 /usr/qt-sqlite
然后把sqlite3和lib下的库文件移植到ARM上
7、在ARM板上运行sqlite
将qlite3文件下载到你的arm板上,
方法很多,你需要根据自己的情况来选择。如ftp,nfs,串口等。 好,开始运行
chmod +wx sqlite
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
方法很多,你需要根据自己的情况来选择。如ftp,nfs,串口等。 好,开始运行
chmod +wx sqlite
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
这里是因为刚刚编译时编译的是动态连接库形式的,所有我们还的将库文件下载到ARM板上。
将 /usr/local/arm-linux/sqlite-arm-linux/lib 目录下所有文件下到ARM板上。 再次运行,
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
将 /usr/local/arm-linux/sqlite-arm-linux/lib 目录下所有文件下到ARM板上。 再次运行,
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
还是出错,哦,我们没有设置环境变量,
假设我们下在库文件在ARM板上的 /usr/qpe/lib/ 目录下,这里设置环境就像下面:
假设我们下在库文件在ARM板上的 /usr/qpe/lib/ 目录下,这里设置环境就像下面:
[root@51Board var]# export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH 好了这样就可以运行了:
[root@51Board var]# ./sqlite3
SQLite version 3.3.8
Enter ".help" for instructions
sqlite>
[root@51Board var]# ./sqlite3
SQLite version 3.3.8
Enter ".help" for instructions
sqlite>
看见
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
下面装载几篇关于sqlite移植的文章,可以参考:
sqlite-3.6.1在uclinux上的移植:
1、 下载源码
$ mkdir -p ~/arm/source/sqlite/
$ cd ~/arm/source/sqlite/
$ wget -c http://www.sqlite.org/sqlite-3.6.1.tar.gz
$ mkdir -p ~/arm/source/sqlite/
$ cd ~/arm/source/sqlite/
$ wget -c http://www.sqlite.org/sqlite-3.6.1.tar.gz
2、 编译安装
1)编译安装前注意设置交叉编译器的路径,我的是在.bashrc中加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
1)编译安装前注意设置交叉编译器的路径,我的是在.bashrc中加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
2) 记得先安装一下readline库,否则在sqlite3的命令行中不能使用shell的
history等功能. 其实这只对pc机上的linux有用(只需sudo apt-get install
libreadline5-dev 就行了),但是对于交叉编译的arm-linux 却没有
readline库,要移植readline库(我的这一步并不成功,不知道是什么原因):
$ wget -c ftp://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz
$ tar zxf readline-5.2.tar.gz
$ cd readline-5.2/
$ ./configure --host=arm-linux --prefix=$(pwd)/_install
$ make
$ make install
history等功能. 其实这只对pc机上的linux有用(只需sudo apt-get install
libreadline5-dev 就行了),但是对于交叉编译的arm-linux 却没有
readline库,要移植readline库(我的这一步并不成功,不知道是什么原因):
$ wget -c ftp://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz
$ tar zxf readline-5.2.tar.gz
$ cd readline-5.2/
$ ./configure --host=arm-linux --prefix=$(pwd)/_install
$ make
$ make install
3) 编译安装sqlite
$ tar zxvf sqlite-3.6.1.tar.gz
$ cd sqlite-3.6.1/
$ ./configure --host=arm-linux --prefix=$(pwd)/_install
--disable-tcl --with-readline-lib=/home/itlanger/
/arm/source/sqlite/readline-5.2/_install/lib
$ make
$ make install
编译安装成功后,会在_install目录下安装三个目录: bin, include 和 lib
3、安装
1) strip一下动态库
$ cd sqlite-3.6.1/_install/lib
$ arm-linux-strip libsqlite3.so.0.8.6
这样就将libsqlite3.so.0.8.6从原来的1M多减少到300多k!
1) strip一下动态库
$ cd sqlite-3.6.1/_install/lib
$ arm-linux-strip libsqlite3.so.0.8.6
这样就将libsqlite3.so.0.8.6从原来的1M多减少到300多k!
2) 将sqlite-3.6.1/_install/lib/* copy到目标板的/usr/lib目录下
$ cp -rP _install/lib/* ~/work/ ##这里work是我的nfs目录
3)将sqlite-3.6.1/_install/bin/sqlite3 copy到目标板的/usr/bin目录下
$ cp -rP _install/lib/* ~/work/ ##这里work是我的nfs目录
3)将sqlite-3.6.1/_install/bin/sqlite3 copy到目标板的/usr/bin目录下
4)将 readline-5.2/lib/* copy到目标板子的/usr/lib目录下
4、测试
1) 转到目标板上运行sqlite3, 没问题吧.
2) 写个小程序测试一下,假设为test.c
3) 程序的编译:
$ arm-linux-gcc -o test test.c -L/home/itlanger/arm/source//
sqlite/sqlite-3.6.1/_install/lib -I/home/itlanger/arm/source/
slqite/sqlite-3.6.1/_install/include -Wall
是不是程序的路径太长了? 可以这样:
$ sudo cp -rP sqlite-3.6.1/_install/lib/libsqlite3.* /usr/local//
arm/3.4.1/arm-linux/lib/
$ sudo cp sqlite-3.6.1/_install/include/* /usr/local/arm/3.4.1//
arm-linux/include/
这样编译就比较方便了:
$ arm-linux-gcc -o test test.c -lsqlite3 -Wall
4、测试
1) 转到目标板上运行sqlite3, 没问题吧.
2) 写个小程序测试一下,假设为test.c
3) 程序的编译:
$ arm-linux-gcc -o test test.c -L/home/itlanger/arm/source//
sqlite/sqlite-3.6.1/_install/lib -I/home/itlanger/arm/source/
slqite/sqlite-3.6.1/_install/include -Wall
是不是程序的路径太长了? 可以这样:
$ sudo cp -rP sqlite-3.6.1/_install/lib/libsqlite3.* /usr/local//
arm/3.4.1/arm-linux/lib/
$ sudo cp sqlite-3.6.1/_install/include/* /usr/local/arm/3.4.1//
arm-linux/include/
这样编译就比较方便了:
$ arm-linux-gcc -o test test.c -lsqlite3 -Wall
sqlite3嵌入式数据库arm+linux移植:
一直想找个嵌入式数据库来用用,几经辛苦,终于了解到有Berkeley DB和SQLite两种很不错的数据库。在一番衡量之后,决定选用SQLite,毕竟它支持SQL。虽然性能比不上Berkeley DB,但免费小巧,速度快。再者它支持SQL92标准,可移植性好。BDB虽然很强可以用于工业应用,但由于不是关系数据库,俺担心移植
性问题。
1. 下载sqlite3源代码
性问题。
1. 下载sqlite3源代码
2. 解压源代码:
tar xvzf sqlite-amalgamation-3.6.1.tar.gz
3. 配置交叉编译到arm linux平台:
./configure --prefix=/home/rootfs/home/sqlite --target=arm-linux --host=arm-linux LD=arm-linux-ld
4. 编译:
make
5. 安装:
make install
头文件和生成的库文件将安装到:/home/rootfs/home/sqlite目录下。
6. 写自己的数据库应用
#i nclude <stdio.h>
#i nclude <sqlite3.h>
#i nclude <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s/n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("/n");
return 0;
}
int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if( argc!=2 ){
fprintf(stderr, "Usage: %s DATABASE /n", argv[0]);
return 0;
}
rc = sqlite3_open(argv[1], &db);
if( rc ){
fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
char *sql = " CREATE TABLE SensorData( /
ID INTEGER PRIMARY KEY, /
SensorID INTEGER, /
SiteNum INTEGER, /
Time VARCHAR(12), /
SensorParameter REAL /
);";
//使用sql字符串指定的sql语言 创建数据表SensorData
sqlite3_exec( db , sql , 0 , callback , &zErrMsg );
//插入数据到数据表
int i;
for(i=0; i<argc; i++){
printf("%s = %s/n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("/n");
return 0;
}
int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if( argc!=2 ){
fprintf(stderr, "Usage: %s DATABASE /n", argv[0]);
return 0;
}
rc = sqlite3_open(argv[1], &db);
if( rc ){
fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
char *sql = " CREATE TABLE SensorData( /
ID INTEGER PRIMARY KEY, /
SensorID INTEGER, /
SiteNum INTEGER, /
Time VARCHAR(12), /
SensorParameter REAL /
);";
//使用sql字符串指定的sql语言 创建数据表SensorData
sqlite3_exec( db , sql , 0 , callback , &zErrMsg );
//插入数据到数据表
sql = "INSERT INTO 'SensorData' VALUES( 0 , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , callback , &zErrMsg );
//插入数据到数据表
sql = "INSERT INTO 'SensorData' VALUES(1 , 1 , 1 , '200605011306', 16.4 );" ;
sqlite3_exec( db , sql , 0 , callback , &zErrMsg );
int nrow = 0, ncolumn = 0;
char **azResult;
int i;
//从数据表查询数据
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( "row:%d column=%d" , nrow , ncolumn );
printf( "The result of querying is :" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ){
printf( "azResult[%d] = %s /r/n", i , azResult[i] );
}
sqlite3_free_table( azResult );
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s/n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( "row:%d column=%d" , nrow , ncolumn );
printf( "The result of querying is :" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ){
printf( "azResult[%d] = %s /r/n", i , azResult[i] );
}
sqlite3_free_table( azResult );
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s/n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
7. 编写Makefile
prefix=/home/rootfs/home/sqlite
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Libs = -L${libdir} -lsqlite3 -lpthread
Cflags = -I${includedir}
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
radiodb: radiodb.o
$(CC) $^ $(Libs) -o $@
radiodb.o:radiodb.c
$(CC) $(Cflags) -c $^ -o $@
clean:
rm -rf radiodb *.o
in:
cp radiodb /home/rootfs/home/sqlite
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Libs = -L${libdir} -lsqlite3 -lpthread
Cflags = -I${includedir}
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
radiodb: radiodb.o
$(CC) $^ $(Libs) -o $@
radiodb.o:radiodb.c
$(CC) $(Cflags) -c $^ -o $@
clean:
rm -rf radiodb *.o
in:
cp radiodb /home/rootfs/home/sqlite
注意makefile里的红色字体内容可以在sqlite安装目录的lib下的pkconfig下的文件查得。
应该是环境变量的问题.
export LD_LIBRAY_PATH=/***/lib:$LD_LIBRARY_PATH
/***/lib 为sqlite库文件的路径.
libsqlite3.so: symbolic link to libsqlite3.so.0.8.6
libsqlite3.so.0: symbolic link to libsqlite3.so.0.8.6
libsqlite3.so.0.8.6: ELF 32-bit LSB shared object, ARM, version 1 (ARM), stripped
就是把这三个文件所在的目录的路径加入到LD_LIBRARY_PATH中就可以了.
export LD_LIBRAY_PATH=/***/lib:$LD_LIBRARY_PATH
/***/lib 为sqlite库文件的路径.
libsqlite3.so: symbolic link to libsqlite3.so.0.8.6
libsqlite3.so.0: symbolic link to libsqlite3.so.0.8.6
libsqlite3.so.0.8.6: ELF 32-bit LSB shared object, ARM, version 1 (ARM), stripped
就是把这三个文件所在的目录的路径加入到LD_LIBRARY_PATH中就可以了.
或者是把这三个文件拷贝到开发板的/usr/lib目录下就OK了.
记住:拷贝时要加选项: cp -arf libsqlite.s* /ust/lib就行了.
这篇虽然很老了,但是后面的调试很详细,也许对你很有帮助:
虽然网上有很多高手对 sqlite 数据库的ARM-Linux移置进行过详细的介绍,但最近发现很多朋友还在问这个问题。
虽然我对 sqlite 的了解说不上透彻,但是写点东西让初学者能够很快上手,特别是能够让刚接触sqlite的朋友也能轻松完成移置工作,
也算是我的心愿之一。也许很多高手会觉得我这是班门弄斧,但是我还是想写点关于 sqlite 的基本知识,这样也许能给予某些人一些帮助,希望如此。
虽然我对 sqlite 的了解说不上透彻,但是写点东西让初学者能够很快上手,特别是能够让刚接触sqlite的朋友也能轻松完成移置工作,
也算是我的心愿之一。也许很多高手会觉得我这是班门弄斧,但是我还是想写点关于 sqlite 的基本知识,这样也许能给予某些人一些帮助,希望如此。
1.1 sqlite简介
(跳过)
1.2 下载代码
(跳过)
1.3 交叉编译sqlite库
准备工作:
1. 取得一个 arm-linux-gcc 的编译器。
2. sqlite的源码 sqlite-3.0.8.tar.gz (本文以)
1. 取得一个 arm-linux-gcc 的编译器。
2. sqlite的源码 sqlite-3.0.8.tar.gz (本文以)
好了,我们可以开始了。
这里设 arm-linux-gcc 在 /usr/local/arm-linux/bin/ 目录下
这里设 arm-linux-gcc 在 /usr/local/arm-linux/bin/ 目录下
解压sqlite-3.0.8.tar.gz 到/usr/local/arm-linux/sqlite
# tar zxvf sqlite-3.0.8.tar.gz -C /usr/local/arm-linux/sqlite
# cd /usr/local/arm-linux/sqlite
# tar zxvf sqlite-3.0.8.tar.gz -C /usr/local/arm-linux/sqlite
# cd /usr/local/arm-linux/sqlite
将目录下的 configure 文件的
19206行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20107行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20514行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20540行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
19206行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20107行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20514行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
20540行 { (exit 1); exit 1; }; }改为 { (echo 1); echo 1; }; }
# mkdir /usr/local/arm-linux/sqlite-arm-linux
# cd /usr/local/arm-linux/sqlite-arm-linux
# cd /usr/local/arm-linux/sqlite-arm-linux
设置交叉编译环境
# export PATH=/usr/local/arm-linux/bin:$PATH
# export PATH=/usr/local/arm-linux/bin:$PATH
配置:
# ../sqlite/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux
注意:这里不用写成了 "../sqlite/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux/"
这最后一个斜杠"/"不要带上了。
# ../sqlite/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux
注意:这里不用写成了 "../sqlite/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux/"
这最后一个斜杠"/"不要带上了。
如果一切顺利的话,会在/usr/local/arm-linux/sqlite-arm-linux目录下生成一些相关文件:
config.log config.status libtool Makefile sqlite3.pc
改/usr/local/arm-linux/sqlite-arm-linux/Makefile文件的 BCC = arm-linux-gcc -g -O2 为 BCC = gcc -g -O2
编译安装:
config.log config.status libtool Makefile sqlite3.pc
改/usr/local/arm-linux/sqlite-arm-linux/Makefile文件的 BCC = arm-linux-gcc -g -O2 为 BCC = gcc -g -O2
编译安装:
# make
# make install
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/lib
./libtool --mode=install /usr/bin/install -c libsqlite3.la /usr/local/arm-linux/sqlite-arm-linux/lib
/usr/bin/install -c .libs/libsqlite3.so.0.8.6 /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.so.0.8.6
(cd /usr/local/arm-linux/sqlite-arm-linux/lib && rm -f libsqlite3.so.0 && ln -s libsqlite3.so.0.8.6 libsqlite3.so.0)
(cd /usr/local/arm-linux/sqlite-arm-linux/lib && rm -f libsqlite3.so && ln -s libsqlite3.so.0.8.6 libsqlite3.so)
/usr/bin/install -c .libs/libsqlite3.lai /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.la
/usr/bin/install -c .libs/libsqlite3.a /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
arm-linux-ranlib /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
chmod 644 /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/arm-linux/sqlite-arm-linux/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/arm-linux/sqlite-arm-linux/lib
# make install
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/lib
./libtool --mode=install /usr/bin/install -c libsqlite3.la /usr/local/arm-linux/sqlite-arm-linux/lib
/usr/bin/install -c .libs/libsqlite3.so.0.8.6 /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.so.0.8.6
(cd /usr/local/arm-linux/sqlite-arm-linux/lib && rm -f libsqlite3.so.0 && ln -s libsqlite3.so.0.8.6 libsqlite3.so.0)
(cd /usr/local/arm-linux/sqlite-arm-linux/lib && rm -f libsqlite3.so && ln -s libsqlite3.so.0.8.6 libsqlite3.so)
/usr/bin/install -c .libs/libsqlite3.lai /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.la
/usr/bin/install -c .libs/libsqlite3.a /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
arm-linux-ranlib /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
chmod 644 /usr/local/arm-linux/sqlite-arm-linux/lib/libsqlite3.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/arm-linux/sqlite-arm-linux/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/arm-linux/sqlite-arm-linux/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
2 sqlite3嵌入式数据库的ARM-Linux移置详解
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
2 sqlite3嵌入式数据库的ARM-Linux移置详解
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/bin
./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/arm-linux/sqlite-arm-linux/bin
/usr/bin/install -c .libs/sqlite3 /usr/local/arm-linux/sqlite-arm-linux/bin/sqlite3
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/include
/usr/bin/install -c -m 0644 sqlite3.h /usr/local/arm-linux/sqlite-arm-linux/include
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/lib/pkgconfig;
/usr/bin/install -c -m 0644 sqlite3.pc /usr/local/arm-linux/sqlite-arm-linux/lib/pkgconfig;
more information, such as the ld(1) and ld.so(8) manual pages.
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/bin
./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/arm-linux/sqlite-arm-linux/bin
/usr/bin/install -c .libs/sqlite3 /usr/local/arm-linux/sqlite-arm-linux/bin/sqlite3
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/include
/usr/bin/install -c -m 0644 sqlite3.h /usr/local/arm-linux/sqlite-arm-linux/include
/usr/bin/install -c -d /usr/local/arm-linux/sqlite-arm-linux/lib/pkgconfig;
/usr/bin/install -c -m 0644 sqlite3.pc /usr/local/arm-linux/sqlite-arm-linux/lib/pkgconfig;
注明: "# make install" 这一步将会在 /usr/local/arm-linux/sqlite-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过的,你可以使用命令“file sqlite”查看文件信息。用strip处理过后,将去掉其中的调试信息,执行文
件大小也将小很多。命令如下:
# arm-linux-strip libsqlite3.so.0.8.6
# 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过的,你可以使用命令“file sqlite”查看文件信息。用strip处理过后,将去掉其中的调试信息,执行文
件大小也将小很多。命令如下:
# arm-linux-strip libsqlite3.so.0.8.6
另外可以生成帮助文档,以便以后查询。
# make doc
# make doc
好了,这样我们已经编译出了
1.4 在ARM板上运行sqlite
将/usr/local/arm-linux/sqlite-arm-linux/bin/目录下的 sqlite3 文件下载到你的arm板上,
方法很多,你需要根据自己的情况来选择。如ftp,nfs,串口等。
方法很多,你需要根据自己的情况来选择。如ftp,nfs,串口等。
好,开始运行
chmod +wx sqlite
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file
or directory
chmod +wx sqlite
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file
or directory
这里是因为刚刚编译时编译的是动态连接库形式的,所有我们还的将库文件下载到ARM板上。
将 /usr/local/arm-linux/sqlite-arm-linux/lib 目录下所有文件下到ARM板上。
再次运行,
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file
or directory
将 /usr/local/arm-linux/sqlite-arm-linux/lib 目录下所有文件下到ARM板上。
再次运行,
[root@51Board var]# ./sqlite3 zieckey.db
./sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file
or directory
还是出错,哦,我们没有设置环境变量,
假设我们下在库文件在ARM板上的 /usr/qpe/lib/ 目录下,这里设置环境就像下面:
假设我们下在库文件在ARM板上的 /usr/qpe/lib/ 目录下,这里设置环境就像下面:
[root@51Board var]# export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH
好了这样就可以运行了:
[root@51Board var]# ./sqlite3 zieckey.db
SQLite version 3.0.8
Enter ".help" for instructions
sqlite>
[root@51Board var]# ./sqlite3 zieckey.db
SQLite version 3.0.8
Enter ".help" for instructions
sqlite>
看见
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
1.5 编写一个程序到ARM板上运行
现在我们来写个C/C++程序,调用 sqlite 的 API 接口函数查询数据库中表的内容。并在ARM板上运行。
下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口. 这个函数调用sqlite3_open() 在 22 行打开数据库, sqlite3_get_table 在 40 行执行 SQL 命令, 并且sqlite3_close() 在 47 行关闭数据库连接。
代码:
// name: test_sqlite.c
// This file is used to test C/C++ API for sqlite
3 sqlite3嵌入式数据库的ARM-Linux移置详解
// Author : zieckey
3 sqlite3嵌入式数据库的ARM-Linux移置详解
// Author : zieckey
// 2006/06/28
#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 *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;
}
return 0;
}
编译:# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out
也许会碰到类似这样的问题:
# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out
test_sqlite.c:7:21: sqlite3.h: No such file or directory
test_sqlite.c: In function `main':
test_sqlite.c:11: error: `sqlite3' undeclared (first use in this function)
test_sqlite.c:11: error: (Each undeclared identifier is reported only once
test_sqlite.c:11: error: for each function it appears in.)
test_sqlite.c:11: error: `db' undeclared (first use in this function)
test_sqlite.c:7:21: sqlite3.h: No such file or directory
test_sqlite.c: In function `main':
test_sqlite.c:11: error: `sqlite3' undeclared (first use in this function)
test_sqlite.c:11: error: (Each undeclared identifier is reported only once
test_sqlite.c:11: error: for each function it appears in.)
test_sqlite.c:11: error: `db' undeclared (first use in this function)
这是个没有找到库文件的问题。
由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:
# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out -lsqlite3
我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,
去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。
不过似乎还是可能出现问题,例如下面的这样:
]# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out -lsqlite3
test_sqlite.c:7:21: sqlite3.h: No such file or directory
test_sqlite.c: In function `main':
test_sqlite.c:11: error: `sqlite3' undeclared (first use in this function)
test_sqlite.c:11: error: (Each undeclared identifier is reported only once
test_sqlite.c:11: error: for each function it appears in.)
test_sqlite.c:11: error: `db' undeclared (first use in this function)
不过似乎还是可能出现问题,例如下面的这样:
]# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out -lsqlite3
test_sqlite.c:7:21: sqlite3.h: No such file or directory
test_sqlite.c: In function `main':
test_sqlite.c:11: error: `sqlite3' undeclared (first use in this function)
test_sqlite.c:11: error: (Each undeclared identifier is reported only once
test_sqlite.c:11: error: for each function it appears in.)
test_sqlite.c:11: error: `db' undeclared (first use in this function)
我们刚才在编译安装的时候,选择了安装路径是 /usr/local/arm-linux/sqlite-arm-linux
这样编译安装时,sqlite的库文件将会生成在 /usr/local/arm-linux/sqlite-ix86-linux/lib 目录下
这时编译还要指定库文件路径,因为系统默认的路径没有包含 /usr/local/arm-linux/sqlite-arm-linux/lib
# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out -lsqlite3 -lsqlite3 -L/usr/local/arm-linux/sqlite-arm-linux/lib
如果还不行的话,可能还需要指定头文件 sqlite3.h 的路径,如下:
# arm-linux-gcc test_sqlite.c -o test_sqlite_for_arm.out -lsqlite3 -L/usr/local/arm-linux/sqlite-arm-linux/lib -I/usr/local/arm-linux/sqlite-arm-linux/include
现在可以看看生成的文件格式:
# file test_sqlite_for_arm.out
test_sqlite_for_arm.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
# file test_sqlite_for_arm.out
test_sqlite_for_arm.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
这说明已经初步成功了。
下面就把 test_sqlite_for_arm.out 文件下载到ARM板上运行了(下载过程不用说了,如串口、ftp、nfs等待都可以)
运行:
[root@51Board var]# ./test_sqlite_for_arm.out
./test_sqlite_for_arm.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
运行是也许会出现类似上面的错误。
这个问题是由于运行沿着系统默认路径没有找到库文件引起的。这时需要指定 libsqlite3.so.0 库文件的路径。
在shell下输入:
[root@51Board var]# export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH
再运行
# test_sqlite_for_arm.out
open zieckey.db successfully!
总结:这里,我们了解了sqlite的移置基本过程,怎么在C/C++中查询数据库中表的内容。
本文一定存在很多不妥或者错误之处,还劳烦各位不吝赐教指正。
转载网址:http://blogold.chinaunix.net/u3/105042/showart_2158035.html