目录
[1. 交叉编译工具链检查](#1. 交叉编译工具链检查)
一、库移植
在嵌入式Linux开发中,很多时候我们需要在ARM开发板上使用数据库来存储数据。SQLite3因其轻量、高效、无需配置等特点,成为不少嵌入式项目的首选。今天我就来详细讲解如何将SQLite3移植到ARM开发板上,并使用交叉编译工具arm-linux-gcc完成整个流程。
1. 交叉编译工具链检查
确保arm-linux-gcc已安装并可用:
arm-linux-gcc --version
如果未安装,可执行:
sudo apt install gcc-arm-linux-gnueabi
2.下载SQLite3源码

3.配置并编译动态库
将源码解压到Linux中
(1)第一步:
# 创建一个用于存放编译结果的目录
mkdir build_arm
cd build_arm
# 运行configure脚本进行配置
# 根据你的工具链安装路径,替换CC变量中的前缀
CC=arm-linux-gnueabihf-gcc \
./../configure \
--host=arm-linux \
--prefix=$(pwd)/install
参数说明:
-
CC=arm-linux-gnueabihf-gcc:明确指定交叉编译器。 -
--host=arm-linux:告知配置脚本,编译出的程序将在 ARM Linux 平台上运行。 -
--prefix:指定编译后的库文件和头文件的安装路径。
注意 :如果你的工具链名称不同(如
arm-none-linux-gnueabi-gcc),请做相应替换。
(2)第二步:
# 开始编译和安装
make
make install
编译完成后,动态库文件会生成在 ./install/lib/ 目录下,其中 libsqlite3.so.0.8.6 就是需要的动态库文件。

注意:如果arm上有动态库了记得删除:

(3)第三步:
将库文件拷贝到ARM上(PATH下 普遍是/lib 或者 /usr/lib)
cp libsqlite3.so.0.8.6 /lib/
注意:拷贝的前提是开发板和虚拟机能够正常通信,并且挂载了NFS服务。
(4)第四步:
编译我们准备好的测试代码
arm-linux-gnueabihf-gcc test.c -o sqlite_test \
-I ./sqlite-autoconf-3530000/build_arm/install/include \
-L ./sqlite-autoconf-3530000/build_arm/install/lib \
-lsqlite3
-I 是找sqlite3.h头文件
-L 是找动态库文件
test代码为:
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i; // 在函数开头声明变量
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main() {
sqlite3 *db;
char *errMsg = 0;
int rc;
// 1. 打开数据库(如果不存在则自动创建)
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
printf("数据库打开成功\n");
// 2. 创建表
const char *sqlCreate =
"CREATE TABLE IF NOT EXISTS COMPANY("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL);";
rc = sqlite3_exec(db, sqlCreate, NULL, 0, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "创建表失败: %s\n", errMsg);
sqlite3_free(errMsg);
sqlite3_close(db);
return 1;
}
printf("表创建成功\n");
// 3. 插入数据
const char *sqlInsert =
"INSERT INTO COMPANY (ID, NAME, AGE) VALUES "
"(1, 'Alice', 25), "
"(2, 'Bob', 30), "
"(3, 'Charlie', 35);";
rc = sqlite3_exec(db, sqlInsert, NULL, 0, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "插入数据失败: %s\n", errMsg);
sqlite3_free(errMsg);
} else {
printf("数据插入成功\n");
}
// 4. 查询数据
const char *sqlSelect = "SELECT * FROM COMPANY";
rc = sqlite3_exec(db, sqlSelect, callback, 0, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "查询失败: %s\n", errMsg);
sqlite3_free(errMsg);
}
// 5. 关闭数据库
sqlite3_close(db);
printf("数据库已关闭\n");
return 0;
}
(5)第五步:
拷贝到我们的开发板上运行即可看到效果:
cp ~/nfs/test ~/nfs/imx6/rootfs/home/root/
二、总结
关键经验:交叉编译需同时指定头文件和库路径;开发板库目录任选 /lib 或 /usr/lib 都能被找到。