分类:
2012-07-10 20:41:49
原文地址:移植sqlite3.7.9到友善之臂mini2440 作者:charles413
开发环境:Redhat 9 kernel 2.4.20 || Fedora 8 kernel 2.6.23,友善之臂mini2440,arm-linux-gcc4.3.2
下载sqlite最新版本3.7.9
源码包:sqlite-autoconf-3070900.tar.gz
解压源码包到/opt目录下:
# tar xvzf sqlite-autoconf-3070900.tar.gz –C /opt/
建立make install目录
# mkdir /opt/build
进入解压出得文件夹中:
# cd /opt/sqlite-autoconf-3070900
执行configure命令,生成Makefile文件:
# ./configure –-host=arm-linux –prefix=/opt/build
生成Makefile文件后,执行make命令:
# make
使用arm-linux-gcc 4.3.2版本执行make后会有错误提示,终止编译,命令行打印信息如下(后来使用arm-linux-gcc 4.4.3版本无错误提示,可以直接完成编译):
/bin/sh ./libtool --tag=CC --mode=compile arm-linux-gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" -DPACKAGE_STRING=\"sqlite\ 3.7.9\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -D_FILE_OFFSET_BITS=64 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -I.@am__isrc@ -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c -o sqlite3.lo sqlite3.c
mkdir .libs
arm-linux-gcc -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" "-DPACKAGE_STRING=\"sqlite 3.7.9\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -D_FILE_OFFSET_BITS=64 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_POSIX_FALLOCATE=1 -I.@am__isrc@ -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE -g -O2 -MT sqlite3.lo -MD -MP -MF .deps/sqlite3.Tpo -c sqlite3.c -fPIC -DPIC -o .libs/sqlite3.o
arm-none-linux-gnueabi-gcc: 3.7.9": No such file or directory
查找原因,与前文的make信息-DPACKAGE_STRING=\"sqlite\ 3.7.9\"相比较,发现是因为"-DPACKAGE_STRING=\"sqlite 3.7.9\""字符之间空格没有转义字符\(之后发现是使用交叉编译器arm-linux-gcc4.3.2会出现这个错误)。
修改Makefile文件:
# vim Makefile
在136行找到-DPACKAGE_STRING=\"sqlite\ 3.7.9\"改为-DPACKAGE_STRING=\"sqlite_3.7.9\",保存退出。
重新执行make指令,建议在make之前先make clean。
等一段时间后,make成功。执行命令:
#make install
完成之后可以发现,之前所建目录/opt/build下生成bin include lib share四个目录。主要用到的文件有./bin/sqlite3,./include/sqlite3.h以及./lib/下的库文件。
bin文件夹下的sqlite3,是sqlite可执行应用程序,下载到板子Linux系统下的/bin目录或者/usr/bin目录下,并添加文件可执行权限。在板子Linux系统命令行下执行:
[root@FriendlyARM bin]# chmod +x sqlite3
进入sqlite命令行,可以实现对数据库的管理。
[root@FriendlyARM plg]# sqlite3
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
提示:要成功在arm开发板运行sqlite3,需要把./lib下的动态链接库下载到板子上。否则会有无法找到动态链接库libsqlite3.so.0的错误提示。
./include/sqlite3.h定义了sqlite的API接口,会在有关sqlite的c文件交叉编译时用到。
./lib/文件夹下是有关sqlite的静态链接库和动态链接库
# ls lib/
libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig
libsqlite3.so和libsqlite3.so.0都是libsqlite3.so.0.8.6的软链接文件。真正需要下载到板子目录/lib下的动态库是libsqlite3.so.0.8.6。下载到板子后,还需对它建立软链接文件,因为可执行程序寻找的动态链接库的名字为libsqlite3.so.0。
[root@FriendlyARM plg]# ln -s /lib/libsqlite3.so.0.8.6 /lib/libsqlite3.so.0
到此,sqlite的移植工作已经完成!下面进行测试。
测试程序test_sqlite.c如下:
动态编译:
# arm-linux-gcc -o test test_sqlite.c -I /opt/build/include/ -L /opt/build/lib/ -lsqlite3
注:-I制定优先搜索头文件路径,-L制定编译的时候,优先搜索库的路径。
下载到板子上执行:
[root@FriendlyARM plg]# ./test xyz.db "create table tbl0(name varchar(10), number
smallint);"
[root@FriendlyARM plg]# ./test xyz.db "insert into tbl0 values('cyc', 1);"
[root@FriendlyARM plg]# ./test xyz.db "insert into tbl0 values('dzy', 2);"
[root@FriendlyARM plg]# ./test xyz.db "select * from tbl0;"
name = cyc
number = 1
name = dzy
number = 2
测试成功!
静态编译:
# arm-linux-gcc -o test test_sqlite.c -I /opt/build/include/ -L /opt/build/lib/ -static -lsqlite3
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlSym':
/opt/sqlite-autoconf-3070900/sqlite3.c:29926: undefined reference to `dlsym'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexLeave':
/opt/sqlite-autoconf-3070900/sqlite3.c:17807: undefined reference to `pthread_mutex_unlock'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexTry':
/opt/sqlite-autoconf-3070900/sqlite3.c:17769: undefined reference to `pthread_mutex_trylock'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexEnter':
/opt/sqlite-autoconf-3070900/sqlite3.c:17723: undefined reference to `pthread_mutex_lock'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexFree':
/opt/sqlite-autoconf-3070900/sqlite3.c:17680: undefined reference to `pthread_mutex_destroy'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `pthreadMutexAlloc':
/opt/sqlite-autoconf-3070900/sqlite3.c:17654: undefined reference to `pthread_mutex_init'
/opt/sqlite-autoconf-3070900/sqlite3.c:17637: undefined reference to `pthread_mutexattr_init'
/opt/sqlite-autoconf-3070900/sqlite3.c:17638: undefined reference to `pthread_mutexattr_settype'
/opt/sqlite-autoconf-3070900/sqlite3.c:17639: undefined reference to `pthread_mutex_init'
/opt/sqlite-autoconf-3070900/sqlite3.c:17640: undefined reference to `pthread_mutexattr_destroy'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlClose':
/opt/sqlite-autoconf-3070900/sqlite3.c:29930: undefined reference to `dlclose'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlError':
/opt/sqlite-autoconf-3070900/sqlite3.c:29899: undefined reference to `dlerror'
/opt/build/lib//libsqlite3.a(sqlite3.o): In function `unixDlOpen':
/opt/sqlite-autoconf-3070900/sqlite3.c:29885: undefined reference to `dlopen'
collect2: ld returned 1 exit status
错误信息中提示有线程接口函数,需要线程的动态链接库,要加入-lpthread选项。在网上查找,按照网友提供的资料dlopen(),dlclose(),dlerror(),dlsym()函数在头文件#include
# arm-linux-gcc -o test test.c -I /opt/build/include/ -L /opt/build/lib -static -lsqlite3 -lpthread –ldl
编译成功,但有一个warning,没有解决,暂时没有发现这个警告对程序影响。
/opt/build/lib/libsqlite3.a(sqlite3.o): In function `unixDlOpen':
/opt/sqlite-autoconf-3070900/sqlite3.c:29885: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
静态编译与动态编译的差别在于,可执行文件较大,即使板子上没有移植动态链接库libsqlite3.so.0,程序也同样可以执行。