Sqlite3交叉编译全过程

Sqlite3交叉编译全过程

一、概述

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

二、下载

下载链接 https://www.sqlite.org/download.html

三、解压

bash 复制代码
tar xvzf sqlite-autoconf-3390300.tar.gz

四、配置

i.M6ull

bash 复制代码
cd sqlite-autoconf-3390300/
./configure --host=arm-none-linux-gnueabi --prefix=/home/leo/linux/sqlite-arm/build

全志T3

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

通过指定编译器的前缀:arm-linux-gnueabihf

只需要修改configure的配置参数即可

bash 复制代码
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文件中,所以在控制台中可以直接调用编译器。

五、编译

bash 复制代码
make

如何指定交叉编译器?

bash 复制代码
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

六、安装

bash 复制代码
make install

七、验证文件类型

bash 复制代码
cd sqlite-arm/build/bin/
file sqlite3

sqlite3: 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

bash 复制代码
cd sqlite-arm/build/include/
ls
sqlite3ext.h  sqlite3.h

8.2、动态链接库移植

将.so文件移植到开发板

8.3、静态态链接库移植

将.a文件移植到程序文件,直接调用编译到程序中

九、验证使用

c 复制代码
#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 的基本使用方法,包括数据库操作、触发器使用和表清空操作。希望本文能为嵌入式开发人员提供有价值的参考。

相关推荐
哈哈幸运7 分钟前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
愚公搬代码28 分钟前
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
数据库·爬虫·python
pwzs38 分钟前
深入浅出 MVCC:MySQL 并发背后的多版本世界
数据库·后端·mysql
大熊猫今天吃什么1 小时前
【一天一坑】空数组,使用 allMatch 默认返回true
前端·数据库
提高记忆力1 小时前
JVM学习
jvm
双叶8361 小时前
(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)
c语言·数据库·单片机·嵌入式硬件·mongodb·51单片机·nosql
XY.散人1 小时前
初识Redis · C++客户端list和hash
数据库·redis·缓存
码上飞扬2 小时前
深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南
数据库·mysql
海洋与大气科学2 小时前
【matlab】地图上的小图
开发语言·数据库·matlab
Java知识库3 小时前
Java BIO、NIO、AIO、Netty面试题(已整理全套PDF版本)
java·开发语言·jvm·面试·程序员