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 的基本使用方法,包括數據庫操作、觸發器使用和表清空操作。希望本文能為嵌入式開發人員提供有價值的參考。