前言
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。本次实验介绍在Linux上实现C语言和SQLite3的交互,利用C语言编写相关语句,连接数据库、操作数据库。
准备工具
1.VMware
2.Linux虚拟机
3.Xshell
4:SQLite源码压缩包(选用,下面会介绍在线安装SQLite到虚拟机)
相关工具的获取
虚拟机1.zip
链接: https://pan.baidu.com/s/1vy3_YpRCVCYQdmiNO0RxGw?pwd=wgu1 提取码: wgu1
Xshell
链接: https://pan.baidu.com/s/1VSt_CQAgE2etUzbj9QAUCQ?pwd=mp5d 提取码: mp5d
配置Linux上的C语言编译环境
可以先检查下Linux上是否配置好GCC相关文件,GCC是C语言的编译器,便于我们后面需要实现C语言和SQLite3的交互。
GCC是Linux系统下最常用的C语言编译器之一。它能够将C语言源代码编译成可执行文件或目标文件,使得程序员能够在Linux环境下编写、测试和运行C语言程序。
1.检查环境
在终端检查是否已经安装gcc
gcc --version
如果没有输出任何信息的话,就说明没有安装配置gcc环境
2.安装gcc、配置gcc环境变量
1)可以使用yum安装,先更新yum源
2) 安装build-essential 包
这个build-essential包包括了GCC编译器、G++以及其他一些必要的工具。安装完这些工具后,你的Linux系统基本上已经配置好了C/C++的开发环境。
sudo yum groupinstall "Development Tools"
或在ubuntu上输入以下命令
sudo apt-get update
sudo apt-get install build-essential
3)检查版本,查看是否完成安装
gcc -v
4)配置环境变量,使C语言文件可以在多种目录下灵活的编译运行
这里gcc和g++的环境变量安装时通常会自动配置到usr/bin
目录下,可以用以下命令输出gcc和g++的存放位置
which gcc
which g++
如果你发现gcc的目录没有在usr/bin目录下,需要手动配置环境变量。你需要用上面两条命令查找到你的gcc存放路径,然后在终端输入
export PATH="gcc存放路径(bin):$PATH"
或者是
export PATH=$PATH:gcc存放目录
重新加载配置文件使其生效
source ~/.bashrc
然后再检查gcc的路径,如果配置完成输出的是usr/bin目录
/usr/bin
是 Linux 文件系统中的一个标准目录,通常用于存放用户级别的可执行程序
。以下是关于 /usr/bin 目录的一些详细信息:
- 系统范围的可执行文件:
• /usr/bin 目录包含大多数标准的、多用途的用户命令和二进制文件。这些命令通常是系统管理员安装和维护的,供所有用户使用。- 与 /bin 的区别:
• /bin 目录通常包含基本的、最小化的系统命令,如 ls, cp, mv 等。这些命令在系统启动和基本操作中是必不可少的。
• /usr/bin 则包含了更多的用户级命令和应用程序,这些命令可能不是系统运行所绝对必须的,但在日常操作中非常有用。例如,开发工具、文本编辑器和其他实用程序通常会安装在 /usr/bin 下。- 权限和访问:
• 通常,只有具有超级用户权限(root)的用户才能向 /usr/bin 目录添加或删除文件。这是为了防止普通用户误操作或恶意操作影响系统的正常运行。- 环境变量:
• /usr/bin 通常包含在系统的默认 PATH 环境变量中,这意味着你可以在终端中直接输入命令来运行这些程序,而不需要指定完整路径。
将 SQLite 的可执行文件(如 sqlite3)拷贝到 /usr/bin 目录下,意味着你可以直接在终端中使用 sqlite3 命令来运行 SQLite 数据库管理工具,而无需每次都提供完整路径。
5)测试能否编译运行.c文件
新建一个.c
文件,写入可执行的c语言代码
保存退出。
6)生成可执行文件,运行可执行文件(目标文件)
gcc -o 目标文件 c语言文件
运行可执行文件
./目标文件
7)配置sqlite3.h头文件和libsqlite3.so*库文件的编译路径
由于我们后面会使用C语言和sqlite进行交互,因此在编写C语言文件时会调用到libsqlite3.so*和sqlite3.h
。这里提前告诉编译器存放位置。
3.头文件和库文件
将头文件和库文件的存放路径告诉给编译器,可以省去C语言程序在调用头文件和库文件的很多麻烦。
可执行文件(如sqlite3)通常位于/bin目录。
库文件(如动态链接库libsqlite3.so)通常位于/lib目录。
头文件(如sqlite3.h)通常位于/include目录。
1)查找sqlite3.h 的存放位置
sudo find / -name "sqlite3.h"
2)指定编译器在搜索头文件时应该查找的目录
export C_INCLUDE_PATH=/home/gec/sqlite/include:$C_INCLUDE_PATH
注意将头文件的路径替换为你查找到的路径
设置其永久有效
source ~/.bashrc
3)查找libsqlite3.so*库文件
find / -name "libsqlite3.so*"
指定编译器在搜索库文件时应该查找的目录
export LIBRARY_PATH=/home/gec/sqlite/lib:$LIBRARY_PATH
注意替换成你自己的库文件路径
加载文件使其生效
source ~/.bashrc
到此C语言的运行环境已经配置完成,接下来安装配置SQLite3。
安装配置SQLite3
方式1.可以使用yum安装(联网推荐)
更新软件包(可选)
sudo apt update (Ubuntu可用)
或者
sudo yum update
安装sqlite3
sudo apt install sqlite3(Ubuntu)
或者
sudo yum install sqlite3
验证安装是否完成
sqlite3
方式2.可以选择源码安装、编译
在Linux联网的情况下,可以选择去官网自行下载最新版本
SQLite官网
本次实验介绍利用Xshell连接Linux,
传输本地sqlite源码文件给Linux(sqlite3官网提供了联网下载,可以直接在虚拟机上访问官网获取软件包;),
如果你的虚拟机上没有安装ssh服务,无法实现Xshell远程连接,请参考这篇文章;或者也可以使用FTP协议,进行本地机向物理机传输文件。
本地机下载好sqlite3源码压缩包,虚拟机链接Xshell,上传文件到指定目录
解压文件
编译安装
进入到sqlite-autoconf-3380500
cd sqlite-autoconf-3380500
指定sqlite3安装目录
./configure --prefix=/home/gec/sqlite
/home/gec/sqlite是安装路径,可以自定义
执行完 ./configure --prefix=/home/gec/sqlite 后,接下来运行 make 和 make install 来编译并安装软件。最终,软件会被安装到 /home/gec/sqlite 目录下,包括可执行文件、库文件、头文件等。
在当前目录下输入make编译sqlite
编译需要一些时间,耐心等待即可。
安装
make install
此时你会在/home/gec/sqlite/bin 看到安装好的sqlite 可执行文件
如果要直接使用可以将该文件拷贝到 /usr/bin目录下(一般情况下安装sqlite3时也会自动配置好环境变量)
3.对sqlite3的简单操作
创建数据库,创建完成数据库在创建一个数据表
实现C语言与SQLite3交互
这里上传一个.c文件到Linux的指定目录
.c文件代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sqlite3.h>
int callback(void *arg, int column_size, char *column_value[], char *column_name[]){
static int count = 0;
int i;
printf("%s\n", (char *)arg);
if(0 == count){
for(i = 0; i < column_size; i++){
printf("%-8s\t", column_name[i]);
}
printf("\n");
}
for(i = 0; i < column_size; i++){
printf("%-8s\t", column_value[i]);
}
printf("\n");
printf("size is %d \n",column_size);
count++;
printf("%d\n",count);
return 0;
}
int main(int argc, const char **argv)
{
sqlite3 *db = NULL;
int ret;
char sql[1024] = "\0";
char *errmsg = NULL;
if(argc < 3){
fprintf(stderr, "please input:%s id name\n", argv[0]);
exit(EXIT_FAILURE);
}
//step 1: create or open database
ret = sqlite3_open("./student.db", &db);
if(SQLITE_OK != ret){
fprintf(stderr, "sqlite3_open:%s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
//step 2: create table
sprintf(sql, "create table if not exists student (id integer, name text)");
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(SQLITE_OK != ret){
fprintf(stderr, "create table:%s\n", sqlite3_errmsg(db));
fprintf(stderr, "create table:%s\n", errmsg);
exit(EXIT_FAILURE);
}
//step3: insert your id and name
sprintf(sql, "insert into student (id, name) values ('%s', '%s')", argv[1], argv[2]);
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(SQLITE_OK != ret){
fprintf(stderr, "insert into:%s\n", sqlite3_errmsg(db));
fprintf(stderr, "insert into:%s\n", errmsg);
exit(EXIT_FAILURE);
}
//step4: select info
sprintf(sql, "select * from student ");
ret = sqlite3_exec(db, sql, callback, "callback msg", &errmsg);
if(SQLITE_OK != ret){
fprintf(stderr, "select:%s\n", sqlite3_errmsg(db));
fprintf(stderr, "select:%s\n", errmsg);
exit(EXIT_FAILURE);//异常退出
}
//last step : close database
sqlite3_close(db);
return 0;
}
进入.c文件可以按照需要修改数据信息
保存退出,生成可执行文件
gcc -o 目标文件名 .c文件名
运行产生的可执行文件后,该目录下会生成一个student.db,此时我们可以输入以下命令,在数据库中查看是否完成了数据表的创建(一定要注意,一条sql语句是要以英文状态下的分号结尾的,一定不要忘记写上英文状态下的分号)
select * from student;
交叉编译ARM Linux下的sqlite3
本次操作环境在Ubuntu上
由于ARM设备通常具有较低的处理能力和内存,
直接在ARM设备上进行开发和编译可能效率低下且不方便。通过交叉编译,开发者可以在性能更强的主机上进行软件开发,然后将编译好的程序部署到目标ARM设备上
。比如我在Ubuntu上进行软件开发,可以在Ubuntu上编译好程序再部署到ARM设备上。
1.官网下载所需版本
https://www.sqlite.org/download.html
2.转到相关目录下解压文件
3.配置交叉编译工具链和安装目录
安装交叉编译链
sudo apt-get install gcc-arm-linux-gnueabihf
一般都是安装时默认在usr/bin目录下,可以which查看下路径,然后配置配置交叉编译环境
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux --prefix=/usr/local
这里,–host=arm-linux-gnueabihf指定目标平台,–prefix指定安装路径(可以根据需要更改),CC指定C编译器。
可以ls查看是否生成了makefile文件,便于下一步进行make编译
4.make编译
5.Install安装
注意需要使用管理员权限
sudo make install
查看生成的SQLite库等文件
根据之前对sqlite进行编译的安装路径usr/local,查找相关文件
在配置SQLite时
使用了--prefix=/usr/local选项
,那么生成的SQLite库文件、可执行文件和其他相关文件通常会被安装到/usr/local目录
下。具体来说:
可执行文件(如sqlite3)通常位于/usr/local/bin目录。
库文件(如动态链接库libsqlite3.so)通常位于/usr/local/lib目录。
头文件(如sqlite3.h)通常位于/usr/local/include目录。
其实做到这一步,我们指导了所有库文件和头文件存放的位置,可以在"配置Linux的C语言编译环境–3“ 中直接将头文件和库文件告诉给编译器
export C_INCLUDE_PATH=/头文件路径/include:$C_INCLUDE_PATH
export C_INCLUDE_PATH=/库文件路径/lib:$C_INCLUDE_PATH
6.将动态库文件放入Linux目标机,并生成软链接
ln -s libsqlite3.so ./libsqlite3.so.0.8.6
若软链接已存在,则新建链接
检查现有链接
ls -l ./libsqlite3.so.0.8.6
创建新连接
sudo ln -s libsqlite3.so.0 ./libsqlite3.so.0.8.7
7.编写一个C语言文件test01.c
#include <stdio.h> // 引入标准输入输出库
#include "sqlite3.h" // 引入SQLite数据库操作库
int main(void)
{
sqlite3 *db = NULL; // 定义一个指向sqlite3结构的指针,用于表示数据库连接
char *err_msg = NULL; // 定义一个字符指针,用于存储错误信息
// 打开名为data.db的数据库文件,如果不存在则创建它
int rc = sqlite3_open("data.db", &db);
// 如果打开数据库失败
if (rc != SQLITE_OK)
{
// 打印错误信息并关闭数据库连接
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1; // 返回错误代码1
}
// SQL语句:删除表t_data(如果存在),然后创建新表t_data,并插入数据
const char *sql = "DROP TABLE IF EXISTS t_data;"
"CREATE TABLE t_data(group,num,data);"
"INSERT INTO t_data VALUES(0,1, 52642);"
"INSERT INTO t_data VALUES(0,2, 57127);"
"INSERT INTO t_data VALUES(0,3, 9000);"
"INSERT INTO t_data VALUES(0,4, 29000);"
"INSERT INTO t_data VALUES(0,5, 350000);"
"INSERT INTO t_data VALUES(0,6, 21000);"
"INSERT INTO t_data VALUES(0,7, 41400);"
"INSERT INTO t_data VALUES(0,8, 21600);";
// 执行SQL语句
rc = sqlite3_exec(db, sql, NULL, NULL, &err_msg);
// 如果执行SQL语句失败
if (rc != SQLITE_OK)
{
// 打印错误信息并释放错误信息内存,然后关闭数据库连接
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1; // 返回错误代码1
}
// 关闭数据库连接
sqlite3_close(db);
return 0; // 程序成功结束,返回0
}
编译完成在程序目录生成test01
arm-linux-gcc test01.c -o test01 -I/usr/local/sqlite3/include -L/usr/local/sqlite3/lib -lsqlite3
将test01拷贝到arm开发板,加权限,运行即可。