交叉编译SQLite3

Posted Kevin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉编译SQLite3相关的知识,希望对你有一定的参考价值。

交叉编译SQLite3

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL 数据库引擎。 它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。 SQLite 直接访问其存储文件。
SQLite是一个轻量级的库,且用C语言实现,它的数据库就是一个文件,这说明它非常适合使用在小型的嵌入式设备。

SQLite3

1、先编译SQLite3,先到SQLite的官网
https://www.sqlite.org/download.html
找到sqlite-src-3360000.zip下载并解压
然后configure

./configure CC=arm-linux-gnu-gcc --host=arm-linux --prefix=/tmp/lib
make && sudo make install
cd /tmp/lib
ls
#返回 bin  include  lib

然后把bin里面的sqlite3拷贝到设备的/bin目录下,运行

$ sqlite3 database.db
sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

提示需要zlib的库,看来SQLite依赖zlib运行

libz和zlib是同一个东西都是表示名称叫z的库,以下不做解释

zlib

先到zlib的官网
https://zlib.net/
下载tar.gz的源码包
然后解压
这个要这么configure,不要问,问就是踩过坑

$ export CC=arm-linux-gnu-gcc
$ ./configure --prefix=/tmp/lib
$ make && sudo make install
$ cd /tmp/lib/lib
$ ls
libsqlite3.a  libsqlite3.la  libz.a  libz.so  libz.so.1  libz.so.1.2.11  pkgconfig

然后把所有libz的库拷到板子的/lib目录下
libz.a libz.so libz.so.1 libz.so.1.2.11
然后再运行sqlite3就可以运行了

简单尝试

SQL一般以.(点)开头以;表示结束
运行

# sqlite3 test.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> create table test (id int primary key,name char, age int);
sqlite> select *from test;
sqlite> insert into test values (1, \'zhangsan\', 18);
sqlite> select *from test;
0|zhangsan|18
sqlite> .exit

简单解释
create table test创建一个表,起名为test
insert into test values (1, \'zhangsan\', 18);录入一个行,name为zhangsan,age为18
select *from test;选择test里面的所有匹配项
.exit退出SQLite3应用
具体的SQLite3可以看网上有很多的SQL的教程。

用于 ARM 的 Sqlite 3.7.15 交叉编译

【中文标题】用于 ARM 的 Sqlite 3.7.15 交叉编译【英文标题】:Sqlite 3.7.15 Crosss compilation for ARM 【发布时间】:2013-03-14 09:00:36 【问题描述】:

我在基于 ARM9 的微处理器中使用 SQLite 3 进行数据库管理。

我想在 Linux (Ubuntu 10.04) 中为我的项目交叉编译最新版本的 SQLite 3。我正在使用arm-none-linux-gnueabi-gcc compiler 进行开发。

我尝试使用以下命令进行交叉编译,

下载sqlite-amalgamation-3.7.0.tar 我把它解压出来,然后在终端上写下面的命令,

sudo ./configure --exec-prefix=/media/8CCC8E9BCC8E7F68/SQLIte3/sqliteinstall/  --host=arm --target=arm CC=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc AR=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-ar STRIP=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-strip RANLIB=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-ranlib CFLAGS="-Os"

它成功交叉编译了 SQLite。

那么,

sudo make 命令。

成功运行。

现在“make install”命令。

它并没有给我一个错误,但是当我转到 config.log 文件时,我发现有一些句子如下,

1.conftest.c:17:7:错误:数组“off_t_is_large”的大小为负 2.conftest.c:12:28:致命错误:ac_nonexistent.h:没有这样的文件或目录 编译终止。 3.conftest.cpp:23:28: 错误: ac_nonexistent.h: 没有这样的文件或目录 4.conftest.c:67:13:错误:一元'*'的无效类型参数(有'int')

我怀疑它是否已正确交叉编译。 看不懂。

我将库插入到我的板上,它工作正常,但问题是速度变得非常慢。我认为有一些问题是我没有为 GCC 编译器设置任何标志。

我找不到任何选项。如何为 GCC 编译器设置特定标志,以便省略不必要的功能。

【问题讨论】:

【参考方案1】:

您可能不应该尝试手动进行交叉编译。相反,请使用嵌入式 Linux 构建系统来为您完成此任务,并完全自动化交叉编译过程。我最喜欢的当然是 Buildroot (http://buildroot.org),但还有很多其他的(质量、复杂性和功能各不相同):OpenEmbedded、Yocto、PTXdist 等。

【讨论】:

感谢您的建议。但我想使用 build Essentials 进行交叉编译。我走得更远。我发现它无法为安装它的编译器找到正确的路径。我说的对吗? 很抱歉,您提供的细节太少了。什么是“构建要素”? Build Essentials 是一个用于构建任何包的实用程序。好的,我得到了解决方案,我已经成功地为基于 ARM9 的板交叉编译了 SQLite3.7.15.2。

以上是关于交叉编译SQLite3的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3

树莓派学习笔记——交叉编译练习之SQLite3安装

交叉编译sqlcipher

如何优化C ++代码的以下片段 - 卷中的零交叉

sqlite3移植到arm linux