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 都能被找到。

相关推荐
HalvmånEver2 小时前
MySQL数据库表(table)操作
linux·数据库·学习·mysql
后端漫漫2 小时前
Redis学习框架
数据库·redis·学习
safedebug2 小时前
此服务器的证书无效 您可能正在连接到一个伪装
笔记·学习
库奇噜啦呼2 小时前
【iOS】alloc & init & new 源码学习
学习·ios·cocoa
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(九):线程池实现(附代码示例)
linux·运维·服务器·c++·学习·架构
许彰午2 小时前
debug驱动学习——三次debug改变我的技术认知
学习
古方路杰出青年2 小时前
学习笔记1:Python FastAPI极简后端API示例解析
笔记·后端·python·学习·fastapi
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(八):<策略模式>日志系统的封装实现
linux·运维·服务器·c++·学习·策略模式
HalvmånEver2 小时前
MySQL数据库操作
linux·数据库·学习·mysql