当前位置:   article > 正文

嵌入式数据库sqlite3交叉编译和移植测试总结_将sqlite3移植到自己的项目代码中

将sqlite3移植到自己的项目代码中

(一) 背景

        根据项目需求,需要使用数据库存放一些数据,比如用户信息、配置参数,以及后期所采集RTU设备的数据等。这里选择了适合嵌入式产品的数据库 -- sqlite3

(二) 移植平台和环境

        主机端:Ubuntu; ARM板:ZLG EasyARM-i.MX283A、飞凌MX6UL-C;

        Sqlite3版本:3.7.143.7.14.0 或 3.7.14.1);

        安装包:sqlite-autoconf-3071400.tar.gz 或 sqlite-autoconf-3071401.tar.gz

(三) 步骤:

下载地址:https://www.sqlite.org/download.html

1. 解压安装包

  1. $ tar -zxvf sqlite-autoconf-3071401.tar.gz
  2. $ cd sqlite-autoconf-3071401

2. 建立不同目录

        在开发产品时,为了效率以及使用的方便性,一般会先在主机端进行程序的设计和验证,而后再经交叉编译,把ARM板可执行的二进制文件copy到指定的路径。故这里涉及到移植两个版本即主机端和ARM板。由于在配置和编译安装时产生一些不同的文件,为了清晰,及管理方便,这里建立了不同目录,以示区分:

  1. $ mkdir build
  2. $ cd build
  3. $ mkdir x86 arm  (主机端和ARM板文件在不同目录下)

3 交叉编译

3.1 编译x86版本(主机端)

  1. $ cd x86
  2. $ ../../configure --prefix=/usr/local
  3. $ make
  4. $ sudo make install
  5. $ sudo ldconfig

        上面配置命令中,--prefix选项后面的路径是编译安装后目标安装的位置,当然这个位置可以自定义安装完成后,产生的文件会存放在配置时指定的目录。bin目录下放的是sqlite3的可执行文件(sqlite3),lib目录下放的是库文件(libsqlite3.alibsqlite3.so.0libsqlite3.so.0.8.6libsqlite3.lalibsqlite3.so),include目录下放的是头文件(sqlite3.h),编译程序时。          

        注:执行上述make时,如果出现“SQLite header and source version mismatch”报错。

        解决方法:(原因)主机端linux系统默认安装了旧版本的SQLite,故需要先把其删除,包括/usr/lib/i386-linux-gnu路径下:libsqlite3.so.0libsqlite3.so.0.8.6两个文件;然后按照上述依次执行:make、make install、ldconfig。

        最后执行:sqlite3 -version,即可看到版本信息。

  1. $ sqlite3 -version
  2. $ 3.7.14.1 2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb

        注:(x86 -- 主机端)编译:要加静态链接

        (1) gcc -o test test.c -lsqlite3  (普通编译)

        (2) gcc -o pass.cgi pass.c cgic.c -lsqlite3 (有其它条件的编译 

3.2 编译arm版本(ARM板)

  1. $ cd ../arm (进到arm目录)
  2. (1)$ ../../configure CC=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc --host=arm-linux --prefix=/home/liuxu/sqlite/sqlite-autoconf-3071400/build/arm/target (ZLG)
  3. (2)$ ../../configure CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc --host=arm-linux --prefix=/home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target (飞凌) 

        注:注意自己主机端交叉编译器的安装路径,以及自己设置的编译和安装路径

  1. $ make
  2. $ make install

        上面配置中,CC指定了ARM的编译工具链,--host指定了平台,安装路径为当前目录的target目录下;install完成后,会在target目录下生成我们所需的执行文件,库文件和头文件等。

        

        编译程序:

$ arm-fsl-linux-gnueabi-gcc -o home-page.cgi home-page.c cgic.c -I /home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target/include/ -L /home/liuxu/sqlite/sqlite-autoconf-3071401/build/arm/target/lib/ -lsqlite3  (飞凌)

       其中,-I指定头文件的路径,-L指定库文件的路径

4. 移植sqlite3到ARM板

(1) 产品开发时,必须考虑ARM板内存空间的问题。为了节省空间,对文件瘦身,去掉没用的调试信息。如下:

  1. $arm-fsl-linux-gnueabi-strip ./target/lib/libsqlite3.so.0.8.6
  2. $arm-fsl-linux-gnueabi-strip ./target/lib/libsqlite3.a
  3. $arm-fsl-linux-gnueabi-strip ./target/bin/sqlite3

      strip后,可执行:ls -l sqlite3查看“瘦身”前后文件大小的变化

(2) 完成上述操作后,还需要把所得到的特定文件放到ARM板上。可以参照主机端,编译x86版本产生文件的路径,把相应的文件放到ARM板上。如/usr/local目录相对应的目录把sqlite3拷贝到ARM板上的/usr/local/bin下,把/lib下的所有文件拷贝到ARM板/usr/local/lib目录下。

       注:不同的ARM板,文件存放的路径不同,上述只是参考。

5. 命令行测试

(1) 版本号:sqlite3 -version

(2) 建立或打开数据库:sqlite3 info.db

(3) 创建数据表:create table user_table(userName,userPasswd);

(4) 向数据表中插入数据:insert into user_table(userName,userPasswd) values(“admin”,”1234”);

(5) 查询数据表:select * from user_table;

(6) 查询数据库信息:.databases

(7) 查询数据库中的表信息:.tables

(8) 退出:.exit

        注:注意命令行中“;”和“.”符号的使用。      

6. 程序测试

  1. /**************** 相关函数说明 ******************/
  2. /1) sqlite3_open的函数原型说明:
  3. int sqlite3_open
  4. (
  5. const char *filename, // Database filename (UTF-8)
  6. sqlite3 **ppDb // OUT: SQLite db handle
  7. );
  8. */
  9. /* (2)sqlite3_exec的函数原型说明:
  10. int sqlite3_exec
  11. (
  12. sqlite3*, // An open database
  13. const char *sql, // SQL to be executed
  14. sqlite_callback, // Callback function
  15. void *, // 1st argument to callback function
  16. char **errmsg // Error msg written here
  17. );*/
  18. /* (3)查询数据
  19. int sqlite3_get_table
  20. (
  21. sqlite3*,
  22. const char *sql,
  23. char ***result, //result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
  24. int *nrow, //nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,
  25. int *ncolumn, //没有查到结果时返回0
  26. char **errmsg
  27. ); */
  28. /******************* SQLite数据库测试 *******************/
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include "sqlite3.h"
  32. #define _DEBUG_ 1
  33. int main(int argc, char *argv[])
  34. {
  35. sqlite3 *db = NULL; //数据库
  36. const char *sql = 0;
  37. char *zErrMsg = 0; //错误信息储存
  38. int nrow = 0, ncolumn = 0; //行和列
  39. char **azResult; //二维数组存放结果
  40. int rc = 0;
  41. int i = 0;
  42. //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
  43. rc = sqlite3_open("rtu_data.db", &db);
  44. if( rc )
  45. {
  46. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  47. sqlite3_close(db);
  48. return 1;
  49. }
  50. else
  51. printf("Open a sqlite3 database named rtu_data.db successfully!\n");
  52. //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
  53. sql = "create table data_table(rtuID, registerNum, data);";
  54. sqlite3_exec(db, sql, 0, 0, &zErrMsg);
  55. #if _DEBUG_
  56. printf("zErrMsg = %s \n", zErrMsg);
  57. #endif
  58. //插入数据: 2种方法
  59. sql = "insert into data_table(rtuID, registerNum, data) values(01, 0001, 1);";
  60. sqlite3_exec(db, sql, 0, 0, &zErrMsg);
  61. sql = "insert into \"data_table\" values(02, 0002, 2.0);";
  62. sqlite3_exec(db, sql, 0, 0, &zErrMsg);
  63. sql = "select * from data_table;";
  64. sqlite3_get_table(db, sql, &azResult, &nrow, &ncolumn, &zErrMsg);
  65. printf("row=%d, column=%d\n", nrow, ncolumn);
  66. printf("\nThe result of querying is:\n");
  67. for(i=0; i<(nrow + 1) * ncolumn; i++)
  68. printf("azResult[%d] = %s\n", i, azResult[i]);
  69. //释放掉 azResult 的内存空间
  70. sqlite3_free_table(azResult);
  71. #if _DEBUG_
  72. printf("zErrMsg = %s \n", zErrMsg);
  73. #endif
  74. sqlite3_close(db); //关闭数据库
  75. return 0;
  76. }

        这里只是总结了嵌入式数据库SQLite的移植和注意项,对其深入的使用和学习,需在接下来的工作中进行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/173195
推荐阅读
相关标签
  

闽ICP备14008679号