前言
SQLite3,轻量级数据库,专为小内存的嵌入式系统设计,做嵌入式Linux应用开发基本都会用这个,语法同MySQL。
要想让自己写的程序在主机(ubuntu)上实现交叉编译,并且编译后的可执行文件能在开发板上运行,我们需要关心两个环境:主机的开发环境和开发板的运行时环境,比如编译器、链接器和各种各样的库(C、C++标准库和其他第三方库)是否匹配。
检查主机工具链
主机的工具链按照 运行C和C++程序(点击跳转🚀) 安装即可。
检查开发板工具链
注意这里使用泰山派官方的buildroot的SDK开发。该SDK只安装了一种链接器,ld-linux-aarch64.so.1,位于/lib64。在该目录下直接执行:
./ld-linux-aarch64.so.1 --help
可以看到该链接器已配置的动态库的搜索路径,这些路径下就是此链接器在运行程序时能找到的库。(其实与环境变量PATH有关)。如果这些路径中没有你的程序所需要的库,那就无法运行
不过还好,buildroot在编译时已经帮我们默认添加了sqlite3,在/usr/lib64里
也就是说开发板的环境是OK的,不需要我们做任何改动。
如果自己编译的SDK没有这些库怎么办?
如果开发板上连sqlite3的可执行程序都没有怎么办?-解决方法在文章末尾~
1. 主机的SQLite3开发环境搭建
首先这一步其实可以不做,如果你仅仅在嵌入式设备上编译和运行的话。但是有时会先在主机上验证程序的功能,那就首先需要搭建主机的sqlite3环境。只需执行两条命令(ubuntu):
sudo apt-get install sqlite3
- 安装sqlite3的二进制可执行程序,执行后可通过命令行操作数据库,在命令行中输入 sqlite3 --version 检查是否安装成功
sudo apt-get install libsqlite3-dev
- 安装符合你主机处理器架构的sqlite3动态链接库(.so)和 include 头文件。
至此,你可以在自己的C程序中通过API用代码操作数据库,比如以下程序。
#include <stdio.h>
#include <sqlite3.h> // 引用头文件
int main(){
sqlite3* my_db;
int ret = sqlite3_open("test_database.db", &my_db);
if(ret == SQLITE_OK){
printf("database connected!");
}
return 0;
}
2
3
4
5
6
7
8
9
10
然后编译,注意要添加链接参数
- gcc test.c -lsqlite3 执行.out,观察输出。当然,现在这个可执行程序还不能在arm开发板上运行。 2. 找到交叉编译工具链的链接器的搜索路径 如果你成功安装了aarch64-linux-gnu工具链的话,依次执行:
- cd /usr/aarch64-linux-gnu/bin
- ld --verbose | grep SEARCH_DIR 和上一步类似,会展示该交叉编译工具链的动态库搜索路径
从这里挑一个路径,比如/usr/lib,记住这个路径,等下编译好的库会放到这里来 3. 下载官方源码
然后传到你虚拟机随便一个路径下,解压:
- tar zxvf sqlite-autoconf-3450100.tar.gz 4. 新建配置 进入解压出来的文件夹
- cd sqlite-autoconf-3450100 添加一个新的配置文件,并输入以下代码
- vi aarch64-configure
#!/bin/bash
ARCH="aarch64"
DEST_CPU="arm64"
HOST_OS="linux"
HOST_ARCH="x86_64"
export LINK_host="g++"
export CXX_host="g++"
export CC_host="gcc"
export AR_host="ar"
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export RANLIB=aarch64-linux-gnu-ranlib
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
if [ -f "configure" ]; then
./configure --prefix=$PWD/output \
--host=aarch64-linux-gnueabi
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
5. 执行配置并编译
依次执行:
- ./aarch64-configure
- make
- make install 生成了output文件夹
其中,bin是可执行程序,include是库头文件,lib里是库文件,share是man文档,可以先不管。
注意这里生成的文件都是在arm处理器下运行的,不是你的主机
6. 复制粘贴
把lib里的这5个文件放进第2步让你记住的那个路径下
include头文件不用管,install时已经自动放进了搜索路径下。
7. 交叉编译,放板子测试
环境搭建完毕,交叉编译test程序:
- aarch64-linux-gnu-gcc test.c -lsqlite3 把编译出的程序传到开发板上,执行,观察效果,成功!
同时在同级目录下成功生成了.db文件
完结。
8. 如果自己编译的SDK没有这些库怎么办?
把编译出的库文件放到“检查开发板工具链”这一章节的目录下。
9. 如果开发板上连sqlite3的可执行程序都没有怎么办?
- 方法一:修改buildroot配置,重新编译一个镜像
- 方法二:把编译出的/bin路径下的可执行程序复制到你PATH环境变量的某个路径下