OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7227|回复: 3

测试下发帖子arm之Sqlite移植

[复制链接]

2

主题

45

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4293
金钱
4293
注册时间
2013-12-27
在线时间
463 小时
发表于 2019-12-24 09:47:40 | 显示全部楼层 |阅读模式
本帖最后由 沐唐 于 2019-12-25 10:20 编辑

Sqlite移植1、首先到http://www.sqlite.org/download.html下载linux版本的源码:sqlite-autoconf-3140100.tar.gz

2.将下载好的文件传到任意目录下,并解压缩

[mt@localhostsqlite-arm-linux]$ ls

sqlite-autoconf-3140100.tar.gz

[mt@localhostsqlite-arm-linux]$ tar -zxf sqlite-autoconf-3140100.tar.gz

[mt@localhostsqlite-arm-linux]$ ls

sqlite-autoconf-3140100 sqlite-autoconf-3140100.tar.gz


3.进入解压缩后的文件目录下,新建install文件夹,以存放后来生成的lib库函数和可执行文件

[mt@localhostsqlite-arm-linux]$ cd sqlite-autoconf-3140100


[mt@localhostsqlite-autoconf-3140100]$ ls

aclocal.m4   depcomp      Makefile.msc  sqlite3.c

compile      INSTALL     missing       sqlite3ext.h

config.guess install-sh   README.txt    sqlite3.h

config.sub   ltmain.sh    Replace.cs    sqlite3.pc.in

configure    Makefile.am  shell.c       sqlite3.rc

configure.ac Makefile.in  sqlite3.1     tea


[mt@localhostsqlite-autoconf-3140100]$ mkdir install

[mt@localhostsqlite-autoconf-3140100]$ cd install


4.进入install目录下,用pwd获取绝对路径,然后退出到上一层

[mt@localhostinstall]$ pwd

/nuc970bsp/sqlite-autoconf-3260000/install

[mt@localhostinstall]$ cd ..

5.使用configure配置文件如下

[mt@localhostsqlite-autoconf-3140100]$ ./configure--prefix=/tjk/tjk/nuc970bsp/sqlite-autoconf-3260000/install --host=arm-linuxCC=arm-linux-gcc

注:CC赋值为嵌入式开发环境所使用的交叉编译工具,后面接自己交叉编译器的路径,    --host指定软件运行环境为arm-linux,   --prefix指定源码交叉编译后生成文件的路径,我们指向了刚才新建的install文件夹

6.make和make install,查看是否生成以下文件

[mt@localhostsqlite-autoconf-3140100]$ make; make install

[mt@localhostsqlite-autoconf-3140100]$ cd install

[mt@localhostinstall]$ ls

bin include  lib  share

[mt@localhostinstall]$ ls bin/

sqlite3

[mt@localhost install]$ls lib/

libsqlite3.a  libsqlite3.so    libsqlite3.so.0.8.6

libsqlite3.la libsqlite3.so.0  pkgconfig


7.将install目录的bin/sqlite3放到目标板子/bin/下,

install目录的lib/libsqlite3.so  libsqlite3.so.0.8.6  libsqlite3.so.0


8.测试是否移植成功,直接输入sqlite3,如下
# sqlite3

SQLite version 3.14.12016-08-11 18:53:32

Enter".help" for usage hints.

Connected to atransient in-memory database.

Use ".openFILENAME" to reopen on a persistent database.


注:
1)
sqlite> .help

sqlite3: can'tresolve symbol '__ctype_b_loc'

使用GCC编译程序时,如果链接到一些比较老的静态库,经常会碰到这个错误:can't resolve symbol '__ctype_b_loc',这是一个兼容性错误,这个错误出现的原因是,在glibc 2.3.2-11及其之后的C库版本,移除了__ctype_b和相关symbal的定义,因为它和新locale模型存在冲突无法并存,这意味着使用Redhat 7.3编译的C静态库,没有办法在RedHat 9及之后的版本保持二进制兼容(这些symbal在RedHat 8中曾经移除,但后来又重新加入了),必须使用新的编译器重新编译这些旧的库文件。
解决办法:找到sqlite文件中所有c和h中包含的#include <ctype.h>,注释掉,重新编译即可解决。
2)对C文件编译的错误

命令:arm-linux-gcc -o test -L ./lib –I ./ test.c-lsqlite3


编译参数介绍如下。
-lsqlite3:用于链接SQLite的开发库。
-lpthread:用于链接多线程库。
-L /lib:指示SQLite中链接库的路径,默认路径为/usr/local/lib,这个要根据自己的实际安装路径进行配置。
-I/include:用于指示SQLite中sqlite3.h头文件所在的目录,这个要根据自己的实际安装路径进行配置。
-static:用于静态编译,如果不加该选项,有时会提示无法找到动态链接库。根据自己的环境是否加上。

typedef int (*sqlite3_callback)(

void*,    /* Dataprovided in the 4th argument of sqlite3_exec() */ sqlite3_exec()函数的第四个参数

int,      /* The numberof columns in row */ 每一行的列数,即数据库中每条数据的包含项数

char**,   /* An array ofstrings representing fields in the row */每条数据对应项目名字

char**    /* An array ofstrings representing column names */每条数据对应项目名字的内容

);
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   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;
   char *zErrMsg = 0;
   int  rc;
   char *sql;

    const char* data = "Callback functioncalled";

   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc )
   {

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

      exit(0);
   }else
   {

      fprintf(stdout, "Opened databasesuccessfully\n");

   }
   /* Create SQL statement */
   //创建

/*          sql ="CREATE TABLE COMPANY("  \

         "ID INT PRIMARY KEY     NOT NULL," \
         "NAME           TEXT    NOT NULL," \
         "AGE            INT     NOT NULL," \
         "ADDRESS        CHAR(50)," \
         "SALARY         REAL );";
    //插入

    sql = "INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY) "  \

         "VALUES (1, 'Paul', 32,'California', 20000.00 ); " \

         "INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY) "  \

         "VALUES (2, 'Allen', 25, 'Texas',15000.00 ); "     \

        "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \

         "VALUES (3, 'Teddy', 23,'Norway', 20000.00 );" \

         "INSERT INTO COMPANY(ID,NAME,AGE,ADDRESS,SALARY)" \

         "VALUES (4, 'Mark', 25,'Rich-Mond ', 65000.00 );";

    //查询     
    sql = "SELECT * from COMPANY";
   //更改

   sql = "UPDATE COMPANY set SALARY =25000.00 where ID=1; " \

         "SELECT * from COMPANY";
    //删除

  sql = "DELETE from COMPANY where ID=3;" \

         "SELECT * fromCOMPANY";        

*/
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void *)data, &zErrMsg);
   if( rc != SQLITE_OK )
   {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
   }
   else
   {
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

sqlite3命令:

1)当出现“…>”时候,我们在输入一个”;”符号,它就会在切换回”sqlite>”状态,

.help可打印出帮助文档
.quit就可以退出sqlite3,回来shell界面。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2019-12-24 09:52:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2013-6-21
在线时间
55 小时
发表于 2021-4-8 21:33:33 | 显示全部楼层
请教楼主,
1。这些动态库在ubuntu下面是任意放在一个install的目录下,我们编译的时候是可以通过makefile来指定位置。

2。而在板子上你放在lib上面,

请问在板子上,又没有makefile, 程序是如何自动去lib文件下找啊?

回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-8-26
在线时间
10 小时
发表于 2023-4-19 15:40:33 | 显示全部楼层
wgj_king 发表于 2021-4-8 21:33
请教楼主,
1。这些动态库在ubuntu下面是任意放在一个install的目录下,我们编译的时候是可以通过makefile ...

程序运行的时候,自己回去找系统的lib目录下的动态库
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-23 04:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表