Sqlite3交叉编译全过程

Sqlite3交叉编译全过程

  • 一、概述
  • 二、下载
  • 三、解压
  • 四、配置
  • 五、编译
  • 六、安装
  • 七、验证文件类型
  • 八、移植
    • 8.1、头文件sqlite3.h
    • 8.2、动态链接库移植
    • 8.3、静态态链接库移植
  • 九、验证使用
    • 9.1. 关键函数说明
  • 十、触发器使用
  • 十一、sqlite表清空且恢复id值
  • 十二、全文总结

一、概述

SQLite 是一个轻量级的嵌入式数据库,广泛应用于嵌入式系统开发中。交叉编译 SQLite 是将 SQLite 编译为目标平台(如 ARM 架构的嵌入式设备)可运行的版本。本文将详细介绍如何在 Linux 环境下交叉编译 SQLite,并验证其在目标平台上的使用。

二、下载

下载链接 https://www.sqlite.org/download.html
在这里插入图片描述

三、解压

tar xvzf sqlite-autoconf-3390300.tar.gz

在这里插入图片描述

四、配置

i.M6ull

cd sqlite-autoconf-3390300/
./configure --host=arm-none-linux-gnueabi --prefix=/home/leo/linux/sqlite-arm/build

全志T3

cd sqlite-autoconf-3390300/
./configure --host=arm-linux-gnueabihf --prefix=/mnt/hgfs/VMShare/T3/sqlite3/build

通过指定编译器的前缀:arm-linux-gnueabihf
只需要修改configure的配置参数即可

CC = /home/tronlong/T3/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc

或者添加到环境变量:
由于交叉编译器已经安装在/home/tronlong/T3/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin目录下,并且已经把/home/tronlong/T3/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin目录添加到/etc/profile文件中,所以在控制台中可以直接调用编译器。
在这里插入图片描述

五、编译

make

在这里插入图片描述

如何指定交叉编译器?

make PREFIX=/mnt/hgfs/VMShare/T3/sqlite3/build CC=/home/tronlong/T3/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc

六、安装

make install

在这里插入图片描述

七、验证文件类型

cd sqlite-arm/build/bin/
file sqlite3sqlite3: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=a0fe1c9b0f059e7ff8ac222d477b006e5c7167cd, not stripped

在这里插入图片描述

八、移植

8.1、头文件sqlite3.h

cd sqlite-arm/build/include/
ls
sqlite3ext.h  sqlite3.h

8.2、动态链接库移植

将.so文件移植到开发板

8.3、静态态链接库移植

将.a文件移植到程序文件,直接调用编译到程序中
在这里插入图片描述

九、验证使用

#include <stdio.h>
#include <sqlite3.h>int main() {sqlite3 *db;          // 数据库句柄char *err_msg = NULL; // 错误信息int rc;               // 返回码// 打开或创建数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 创建表const char *create_table_sql = "CREATE TABLE IF NOT EXISTS users (""id INTEGER PRIMARY KEY,""name TEXT NOT NULL,""age INTEGER);";rc = sqlite3_exec(db, create_table_sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL 错误: %s\n", err_msg);sqlite3_free(err_msg);sqlite3_close(db);return 1;}// 插入数据const char *insert_sql = "INSERT INTO users (name, age) VALUES ('Alice', 25);""INSERT INTO users (name, age) VALUES ('Bob', 30);";rc = sqlite3_exec(db, insert_sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL 错误: %s\n", err_msg);sqlite3_free(err_msg);}// 查询数据(回调函数)int callback(void *data, int argc, char **argv, char **col_name) {for (int i = 0; i < argc; i++) {printf("%s = %s\n", col_name[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;}const char *select_sql = "SELECT * FROM users;";rc = sqlite3_exec(db, select_sql, callback, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL 错误: %s\n", err_msg);sqlite3_free(err_msg);}// 更新数据const char *update_sql = "UPDATE users SET age = 26 WHERE name = 'Alice';";rc = sqlite3_exec(db, update_sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL 错误: %s\n", err_msg);sqlite3_free(err_msg);}// 删除数据const char *delete_sql = "DELETE FROM users WHERE name = 'Bob';";rc = sqlite3_exec(db, delete_sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL 错误: %s\n", err_msg);sqlite3_free(err_msg);}// 关闭数据库sqlite3_close(db);return 0;
}

9.1. 关键函数说明

1、 sqlite3_open(const char *filename, sqlite3 **ppDb)
打开数据库文件,若不存在则创建。
返回 SQLITE_OK 表示成功。

2、sqlite3_exec(sqlite3 *db, const char *sql, callback, void *data, char **errmsg)
执行 SQL 语句。
callback 函数用于处理查询结果(见示例中的回调函数)。

3、sqlite3_close(sqlite3 *db)
关闭数据库连接。

4、错误处理
使用 sqlite3_errmsg(db) 获取错误信息。
释放错误消息内存:sqlite3_free(err_msg)。

十、触发器使用

9.1、当设定触发器后,修改过表名,由于触发器内写的表名是修改之前的,所有在触发器中的操作会使得操作失败
在这里插入图片描述

触发器
在这里插入图片描述

修改触发器后解决问题。

十一、sqlite表清空且恢复id值

只需要清空表格;然后将sqlite_sequence表中对应表格的seq置为0;也可以直接把sqlite_sequenc中对应表名的记录删除掉。

十二、全文总结

本文详细介绍了 SQLite 的交叉编译过程,包括环境准备、源码下载、配置、编译、验证、移植和使用。通过本文的步骤,读者可以在 Linux 环境下成功交叉编译 SQLite,并将其移植到目标嵌入式平台。此外,本文还介绍了 SQLite 的基本使用方法,包括数据库操作、触发器使用和表清空操作。希望本文能为嵌入式开发人员提供有价值的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考软件设计师考试情况与大纲概述

文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1&#xff1a;计算机与软件工程知识****科目2&#xff1a;软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理&#xff0c;并…

【数学建模】孤立森林算法:异常检测的高效利器

孤立森林算法&#xff1a;异常检测的高效利器 文章目录 孤立森林算法&#xff1a;异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一&#xff1a;构建孤立树(iTree)步骤二&#xff1a;构建孤立森林(iForest)步骤三&#xff1a;计算异常分数 3 代码实现…

【Android面试八股文】Android系统架构【一】

Android系统架构图 1.1 安卓系统启动 1.设备加电后执行第一段代码&#xff1a;Bootloader 系统引导分三种模式&#xff1a;fastboot&#xff0c;recovery&#xff0c;normal&#xff1a; fastboot模式&#xff1a;用于工厂模式的刷机。在关机状态下&#xff0c;按返回开机 键进…

jvm-获取方法签名的方法

在Java中&#xff0c;获取方法签名的方法可以通过以下几种方式实现&#xff0c;具体取决于你的需求和使用场景。以下是详细的介绍&#xff1a; 1. 使用反射 API Java 提供了 java.lang.reflect.Method 类来获取方法的相关信息&#xff0c;包括方法签名。 示例代码&#xff1a…

DeepSeek和Excel结合生成动态图表

文章目录 一、前言二、3D柱状图案例2.1、pyecharts可视化官网2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、动态调整数据 一、前言 最近在找一些比较炫酷的动态图表&#xff0c;用于日常汇报&#xff0c;于是找到了 DeepseekExcel王牌组合&#xff0c;其等同于动态图…

探索 .bat 文件:自动化任务的利器

在现代计算机操作中&#xff0c;批处理文件&#xff08;.bat 文件&#xff09;是一种简单而强大的工具&#xff0c;它可以帮助我们自动化重复性任务&#xff0c;工作效率提高。尽管随着编程语言和脚本工具的发展&#xff0c;.bat 文件的使用频率有所下降&#xff0c;但它依然是…

PyTorch与自然语言处理:从零构建基于LSTM的词性标注器

目录 1.词性标注任务简介 2.PyTorch张量&#xff1a;基础数据结构 2.1 张量创建方法 2.2 张量操作 3 基于LSTM的词性标注器实现 4.模型架构解析 5.训练过程详解 6.SGD优化器详解 6.1 SGD的优点 6.2 SGD的缺点 7.实用技巧 7.1 张量形状管理 7.2 广播机制 8.关键技…

【C++】特殊类的设计、单例模式以及Cpp类型转换

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; C 智能指针使用&#xff0c;以及shared_ptr编写 下篇文章&#xff1a; C IO流 目录 特殊类的设…

探索 Flowable 后端表达式:简化流程自动化

什么是后端表达式&#xff1f; 在 Flowable 中&#xff0c;后端表达式是一种强大的工具&#xff0c;用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑&#xff0c;或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行&#xff0c;无法访问前端…

【Lua】Lua 入门知识点总结

Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用&#xff0c;包括全局变量和局部变量的区别&#xff0c;以及nil类型的概念、数值型、字符串和函数的基本操作&#xff0c;包括16进制表示、科学计数法、字符串连接、函数声明…

符号速率估计——小波变换法

[TOC]符号速率估计——小波变换法 一、原理 1.Haar小波变换 小波变换在信号处理领域被成为数学显微镜&#xff0c;不同于傅里叶变换&#xff0c;小波变换可以观测信号随时间变换的频谱特征&#xff0c;因此&#xff0c;常用于时频分析。   当小波变换前后位置处于同一个码元…

android contentProvider 踩坑日记

写此笔记原因 学习《第一行代码》到第8章节实现provider时踩了一些坑&#xff0c;因此记录下来给后来人和自己一个提示&#xff0c;仅此而已。 包含内容 Sqlite数据库CURD内容provider界面provider项目中书籍管理provider实现逻辑用adb shell确认providercontentResolver接收…

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…

【开关电源】关于GaN反激电源开关噪声

文章目录 0 前言1 设计信息1.1 设计需求1.2 原理图1.3 电源表现 2 原因分析3 横向对比TI UCG28826 &#xff08;GaN&#xff09;采购的普通QR反激变换器 4 总结 0 前言 笔者原计划设计一款省电的&#xff0c;效率尚可的&#xff0c;稳定的2路输出反激电源&#xff0c;用于系统…

DOCA介绍

本文分为两个部分&#xff1a; DOCA及BlueField介绍如何运行DOCA应用&#xff0c;这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍&#xff1a; 现代企业数据中心是软件定义的、完全可编程的基础设施&#xff0c;旨在服务于跨云、核心和边缘环境的高度分布式应用工作…

mybatis mapper.xml中使用枚举

重点&#xff1a;application.propertis配置类 #TypeEnumHandler 这个类的包名&#xff0c;不是全路径 mybatis.type-handlers-packagecom.fan.test.handler两个枚举类&#xff1a; public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…

鸿蒙生态:鸿蒙生态校园行心得

&#xff08;个人观点&#xff0c;仅供参考&#xff09; 兄弟们&#xff0c;今天来浅浅聊一聊这次的设立在长沙的鸿蒙生态行活动。 老样子&#xff0c;我们先来了解一下这个活动&#xff1a; &#xff28;&#xff41;&#xff52;&#xff4d;&#xff4f;&#xff4e;&#x…

【速写】多LoRA并行衍生的一些思考

迁移学习上的一个老问题&#xff0c;怎么做多领域的迁移&#xff1f;以前的逻辑认为领域迁移属于是对参数做方向性的调整&#xff0c;如果两个领域方向相左&#xff0c;实际上不管怎么加权相加都是不合理的。 目前一些做法想着去观察LoRA权重矩阵中的稠密块与稀疏块&#xff0…

【Delphi 基础知识 44】接口interface的应用

目录 1. 前言2. 接口有哪些优势2.1. 实现多态性2.2 实现多重(解决单继承限制)2.3 解耦代码(依赖注入)2.4 便于测试(模拟接口)2.5 跨语言互操作性(COM支持)1. 前言 总结为一句话就是:接口只告诉你要做什么,而类会告诉你应该怎么做 下面是最简单的接口实现 typeIMyIn…

09.传输层协议 ——— TCP协议

文章目录 TCP协议 谈谈可靠性TCP协议格式 序号与确认序号窗口大小六个标志位 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…