Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248444
  • 博文数量: 37
  • 博客积分: 837
  • 博客等级: 准尉
  • 技术积分: 566
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-26 17:36
文章分类

全部博文(37)

文章存档

2012年(31)

2011年(6)

我的朋友

分类: SQLite/嵌入式数据库

2011-11-19 21:15:15

开发环境Redhat 9 kernel 2.4.20 || Fedora 8 kernel 2.6.23,友善之臂mini2440arm-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

: warning: missing terminating " character

查找原因,与前文的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定义了sqliteAPI接口,会在有关sqlitec文件交叉编译时用到。

    ./lib/文件夹下是有关sqlite的静态链接库和动态链接库

# ls lib/

libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig

    libsqlite3.solibsqlite3.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如下:

  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3.  
  4. static int callback(void *NotUsed, int argc, char **argv, char **azColName)
  5. {
  6.     int i;
  7.     for(i=0; i<argc; i++)
  8.     {
  9.         printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  10.     }
  11.     printf("\n");
  12.     return 0;
  13. }
  14.  
  15. int main(int argc, char **argv)
  16. {
  17.     sqlite3 *db;
  18.     char *zErrMsg = 0;
  19.     int rc;
  20.     if( argc!=3 )
  21.     {
  22.         fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  23.     }
  24.     rc = sqlite3_open(argv[1], &db);
  25.     if( rc )
  26.     {
  27.         fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  28.         sqlite3_close(db);
  29.     }
  30.     rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  31.     if( rc!=SQLITE_OK )
  32.     {
  33.         fprintf(stderr, "SQL error: %s\n", zErrMsg);
  34.     }
  35.     sqlite3_close(db);
  36.     return 0;
  37. }

 动态编译:

# 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 中,同样需要添加编译选项-ldl

# 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,程序也同样可以执行。

阅读(3418) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~