交叉编译 手动安装 SQLite 库 移植ARM
# 下载源码 wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz tar -xzf sqlite-autoconf-3420000.tar.gz cd sqlite-autoconf-3420000
cd /home/lxh/sqlite-autoconf-3420000
make distclean //清除下,因为我安装失败过。
./configure --host=arm-linux-gnueabihf \
--prefix=/home/lxh/arm-libs/install \
CFLAGS="-Os"
make -j$(nproc)
make install
检查生成的库文件
:ls -lh /home/lxh/arm-libs/install/lib/libsqlite3.*
#include "sqlite_query.h"
#include <stdio.h>
#include <stdlib.h>
#include "/usr/include/sqlite3.h"// 查询结果回调函数类型定义
typedef int (*QueryCallback)(void *data, int argc, const char **argv, const char **col_name);int query_aircraft_by_icao(const char *db_path,const char *icao,QueryCallback callback,void *user_data);int query_aircraft_by_icao(const char *db_path,const char *icao,QueryCallback callback,void *user_data)
{sqlite3 *db;int rc;rc = sqlite3_open(db_path, &db);if (rc != SQLITE_OK){fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));return rc;}const char *sql = "SELECT * FROM aircraft_data WHERE icao = ?;";sqlite3_stmt *stmt;rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);if (rc != SQLITE_OK){fprintf(stderr, "准备SQL失败: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return rc;}sqlite3_bind_text(stmt, 1, icao, -1, SQLITE_STATIC);while ((rc = sqlite3_step(stmt)) == SQLITE_ROW){int col_count = sqlite3_column_count(stmt);const char **argv = (const char **)malloc(col_count * sizeof(const char *));const char **col_name = (const char **)malloc(col_count * sizeof(const char *));for (int i = 0; i < col_count; i++){col_name[i] = sqlite3_column_name(stmt, i);argv[i] = (const char *)sqlite3_column_text(stmt, i);}if (callback){callback(user_data, col_count, argv, col_name);}free((void *)argv);free((void *)col_name);}if (rc != SQLITE_DONE){fprintf(stderr, "查询执行错误: %s\n", sqlite3_errmsg(db));}sqlite3_finalize(stmt);sqlite3_close(db);return (rc == SQLITE_DONE) ? SQLITE_OK : rc;
}static int print_result(void *data, int argc, const char **argv, const char **col_name)
{printf("----- 找到记录 -----\n");for (int i = 0; i < argc; i++){printf("%-12s: %s\n", col_name[i], argv[i] ? argv[i] : "NULL");}return 0;
}int main()
{const char *db_path = "/usr/local/test/radardata.db";const char *icao = "780CAF";printf("正在查询 ICAO: %s...\n", icao);int ret = query_aircraft_by_icao(db_path, icao, print_result, NULL);if (ret != SQLITE_OK){fprintf(stderr, "查询失败 (错误码: %d)\n", ret);return 1;}return 0;
}
# 工具链设置(如果是交叉编译,取消下面两行注释)
# CROSS_COMPILE = arm-linux-gnueabihf-
# CC = $(CROSS_COMPILE)g++# 如果是本地编译,使用g++
CC = arm-linux-gnueabihf-gcc
CURL_DIR = /home/lxh/arm-libs/install
# 编译选项
CFLAGS =-I$(CURL_DIR)/include -I. -g -Wall
LDFLAGS =-L$(CURL_DIR)/lib -lsqlite3 -lpthread# 目标文件
TARGET = sqlite_query
SRCS = sqlite_query.cpp
OBJS = $(SRCS:.cpp=.o)# 默认目标
all: $(TARGET)# 主目标
$(TARGET): $(OBJS)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)# 生成.o文件
%.o: %.cpp$(CC) $(CFLAGS) -c $< -o $@# 清理
clean:rm -f $(OBJS) $(TARGET)# 运行测试
run: $(TARGET)./$(TARGET)# 数据库查看
db:sqlite3 radardata.db ".schema"sqlite3 radardata.db "SELECT * FROM aircraft_data;"