在mini2440上的移植sqlite3(成功)

开发环境:Fedora9 

开发板:友善之臂mini2440,内核版本Linux FriendlyARM 2.6.32.2-FriendlyARM #1 Fri Mar 4 17:57:58 CST 2011 armv4tl unknown

交叉编译环境:arm-linux-gcc4.4.3(补充说明:之前安装没成功,因为是arm-linux-gcc4.5.1,编译的可执行程序在mini2440上运行属于Illegal Instruction,连基本的hello.c  都不能运行)

下载sqlite最新版本:http://www.sqlite.org/download.html

                   源码包:sqlite-autoconf-3071401.tar

       解压源码包到/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

(网上说这一步有错误,需要修改Makefile文件,但是我运行没有错误,所以就没修改。)

             等一段时间后,make成功。执行命令:
#make install
完成之后可以发现,之前所建目录/opt/build下生成
bin  include  lib  share四个目录。(/opt/build/目录就是arm版本的sqlite3库文件位置)


主要用到的文件
有./bin/sqlite3,./include/sqlite3.h以及./lib/下的库文件。

(注意:后来经过多次移植发现只需要移植两个文件:sqlite3和libsqlite3.so.0,前一个放到开发板/bin目录下,并chmod +x sqlite3;后一个直接下载到/lib目录)

(1)移植可执行文件

bin文件夹下的sqlite3,是sqlite可执行应用程序,下载到板子Linux
系统下的/bin目录或者/usr/bin目录下,并添加文件可执行权限。在板子
Linux系统命令行下执行:
[root@FriendlyARM bin]# chmod +x sqlite3

(2)移植头文件

    ./include/sqlite3.h定义了sqlite的API接口,会在有关sqlite的c文件交叉编译时用到。 

(3)移植库文件

    ./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的移植工作已经完成!下面进行测试。

第一种方法是直接输入sqlite3命令:

[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>

说明配置成功了。

第二种方法:

    测试程序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;

          }
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制定编译的时候,优先搜索库的
路径。
    下载到板子上执行:(也要给test添加执行权限喔#chmod +x test)

[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 test1  test.c -I /opt/build/include/ -L /opt/build/lib -static -lsqlite3 -lpthread –ldl

也成功了。

至此说明移植成功了,下面就是学习如何使用sqlite3了。

 

附件:测试程序注释

test_sqlite.c

#include <stdio.h>
#include <sqlite3.h>
/*执行到sqlite3_exec的回调函数*/
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; /*sqlite里最常用的是sqlite3 *类型*/
  char *zErrMsg = 0;
  int rc;
  if( argc!=3 ) /*可执行程序有三个参数*/
  {
   fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  }
  rc = sqlite3_open(argv[1], &db);
  /*main()第一个参数是可执行文件名,main()第二个参数是打开或创建的数据库文件名*/
  if( rc )
  {
   fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
   sqlite3_close(db); /*打开或创建数据库失败就关闭数据库*/
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  /*main()第三个参数argv[2]传入到上面这条执行sql语句,查询数据库*/
  if( rc!=SQLITE_OK )  /*SQLITE_OK表示操作正常*/
  {
     fprintf(stderr, "SQL error: %s\n", zErrMsg);
  }
   sqlite3_close(db);/*关闭数据库*/
   return 0;
}

 

你可能感兴趣的:(在mini2440上的移植sqlite3(成功))