Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35018
  • 博文数量: 15
  • 博客积分: 360
  • 博客等级: 入伍新兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-28 01:43
文章分类
文章存档

2011年(15)

分类: SQLite/嵌入式数据库

2011-07-21 13:12:50

内核版本: linux-2.6.31

交叉编译器版本:arm-linux-gcc 4.1.2

操作系统平台: linux-enterprise-5

开发板平台:arm9-S3C2440

Sqlite版本:sqlite-3.7.6.2

1.       准备编译环境

(1)交叉编译器设置

Vim /etc/profile

Export PATH=

(2)解压数据库,创建编译目录

tar xzvf sqlite3-3.7.6.2

mkdir cross_build

mkdir /usr/local/sqlite3 -P

cd cross_build

 

2.交叉编译

(1)../sqlite3-3.7.6.2/configure –host=arm-linux –prefix=/usr/local/sqlite3

--host=arm-linux是生成arm下的相关文件,--prefix=/usr/local/sqlite3是最后的生成的文档全部放在/usr/local/sqlite3目录下

(2)Make

采用动态编译,否则需要将Makefile中的以“.la”结尾的文件,改成“.a

(3)Make install

/usr/local/sqlite3下会出现bin,include,lib等三个目录,bin目录下存放的是sqlite3可执行程序,lib下是sqlite3需要的动态库,include是库所需要的头文件

(4)去掉调试信息,减小体积

库文件已经生成在为了减小执行文件大小可以用strip处理,去掉其中的调试信息。           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

arm-linux-strip libsqlit3.so.0.8.6

 

3.移植到开发板

将虚拟机下的/usr/local/sqlite3目录全部拷贝到开发板的/usr/local/目录下

/etc/profile中添加库路径信息:

export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH

Cp /usr/local/sqlite3/bin/sqlite3 /usr/bin

 

4.在开发板上运行sqlite3

在开发板/home/crb/test目录下

[root@rootlocalhost test]#sqlite3 db_exam.db

       SQLite version 3.7.6.2

       Enter ".help" for instructions

       sqlite>create table tbl_exam (name,char(10), addr char(30));

sqlite>insert into tbl_exam values(‘bob’,’beijing’);

sqlite>.exit

(1)编写测试用例

在虚拟机中

[root@rootlocalhost test]#vim test.c

#include

 #include

 

static int callback(void *NotUsed, int argc, char **argv, char **azColName)

{

   int i;

  for(i=0; 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!=3 ){

     fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);

     exit(1);

    }

    rc = sqlite3_open(argv[1], &db);

    if( rc ){

      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));

     sqlite3_close(db);

      exit(1);

    }

    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

    if( rc!=SQLITE_OK ){

      fprintf(stderr, "SQL error: %s\n", zErrMsg);

      sqlite3_free(zErrMsg);

    }

    sqlite3_close(db);

    return 0;

 }

然后保存退出

[root@rootlocalhost test]#vim Makefile

CC=arm-linux-gcc

test:test.c

       ${CC} test.c -I/usr/local/sqlite3/include -L/usr/local/sqlite3/lib -lsqlite3 -o test

[root@rootlocalhost test]#make

将生成的test拷贝到开发板的/home/crb/test目录下

执行./test db_exam “select * from tbl_exam”

bob  beijing

 

5.常见错误

1) sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory

解决办法:

libsqlite3.so.0找不到,需要加载库的路径信息

export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH,或者在/etc/profile中加载这句话,这样就不必每次都执行这样一句话了

2)    静态编译出现未定义错误

in function …..

undefined pthread_lock….

Undefined ldopen…

解决办法:

gcc test.c –I/usr/local/sqlite3/include –L/usr/local/sqlite3/lib \

–lsqlite3 –lpthread –ldl –o test

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