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
这样可以让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时用到.
BCC = arm-linux-gcc -g -O2
改成:
BCC = gcc -g -O2
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
make && make install
这里如果不出意外,将不会出现错误,那么库文件已经生成在
/home/sqlite-3.3.8/sqlite-arm-linux/lib目录下,
库文件已经生成在为了减小执行文件大小可以用strip处理,去掉其中的调试信息。
arm-linux-strip libsqlit3.so.0.8.6
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
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
这就是在开发板上可以直接运行的可执行文件。
需要注意:
拷贝是需要加上 –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
方法很多,你需要根据自己的情况来选择。如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
将 /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/ 目录下,这里设置环境就像下面:
[root@51Board var]# ./sqlite3
SQLite version 3.3.8
Enter ".help" for instructions
sqlite>
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
$ mkdir -p ~/arm/source/sqlite/
$ cd ~/arm/source/sqlite/
$ wget -c http://www.sqlite.org/sqlite-3.6.1.tar.gz
1)编译安装前注意设置交叉编译器的路径,我的是在.bashrc中加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
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
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!
$ cp -rP _install/lib/* ~/work/ ##这里work是我的nfs目录
3)将sqlite-3.6.1/_install/bin/sqlite3 copy到目标板的/usr/bin目录下
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
性问题。
1. 下载sqlite3源代码
#i nclude <sqlite3.h>
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(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;
}
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
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中就可以了.
虽然我对 sqlite 的了解说不上透彻,但是写点东西让初学者能够很快上手,特别是能够让刚接触sqlite的朋友也能轻松完成移置工作,
也算是我的心愿之一。也许很多高手会觉得我这是班门弄斧,但是我还是想写点关于 sqlite 的基本知识,这样也许能给予某些人一些帮助,希望如此。
1.1 sqlite简介
1.2 下载代码
(跳过)
1. 取得一个 arm-linux-gcc 的编译器。
2. sqlite的源码 sqlite-3.0.8.tar.gz (本文以)
这里设 arm-linux-gcc 在 /usr/local/arm-linux/bin/ 目录下
# tar zxvf sqlite-3.0.8.tar.gz -C /usr/local/arm-linux/sqlite
# cd /usr/local/arm-linux/sqlite
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; }; }
# cd /usr/local/arm-linux/sqlite-arm-linux
# 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/"
这最后一个斜杠"/"不要带上了。
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 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
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'
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;
# 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
1.4 在ARM板上运行sqlite
方法很多,你需要根据自己的情况来选择。如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
将 /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/ 目录下,这里设置环境就像下面:
[root@51Board var]# ./sqlite3 zieckey.db
SQLite version 3.0.8
Enter ".help" for instructions
sqlite>
sqlite>
提示符号没有?成功了。哈哈!!
打个“.help”来看看命令先:-)
sqlite>.help
好了。现在sqlite已经在arm-linux下跑了起来。如何,感觉很high吧。
现在我们来写个C/C++程序,调用 sqlite 的 API 接口函数查询数据库中表的内容。并在ARM板上运行。
3 sqlite3嵌入式数据库的ARM-Linux移置详解
// Author : zieckey
#include <stdio.h>
#include <sqlite3.h>
{
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");
return 0;
}
编译:# 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)
这是个没有找到库文件的问题。
不过似乎还是可能出现问题,例如下面的这样:
]# 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
# 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
运行是也许会出现类似上面的错误。
总结:这里,我们了解了sqlite的移置基本过程,怎么在C/C++中查询数据库中表的内容。
本文一定存在很多不妥或者错误之处,还劳烦各位不吝赐教指正。
转载网址:http://blogold.chinaunix.net/u3/105042/showart_2158035.html
1809



被折叠的 条评论
为什么被折叠?



