ARM嵌入式学习(二十四)--- 库移植(移植到开发板)

目录

一、库移植

[1. 交叉编译工具链检查](#1. 交叉编译工具链检查)

2.下载SQLite3源码

3.配置并编译动态库

将源码解压到Linux中

(1)第一步:

(2)第二步:

(3)第三步:

(4)第四步:

(5)第五步:

二、总结


一、库移植

在嵌入式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 都能被找到。

相关推荐
通信小呆呆5 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick5 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee5 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e5 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨5 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
cqbzcsq5 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan5 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
guslegend5 天前
理论学习:什么是 Coding Agent?
学习
自传.5 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding