Linux中安装配置SQLite3,并实现C语言与SQLite3的交互。

前言

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 目录的一些详细信息:

  1. 系统范围的可执行文件:
    • /usr/bin 目录包含大多数标准的、多用途的用户命令和二进制文件。这些命令通常是系统管理员安装和维护的,供所有用户使用。
  2. 与 /bin 的区别:
    • /bin 目录通常包含基本的、最小化的系统命令,如 ls, cp, mv 等。这些命令在系统启动和基本操作中是必不可少的。
    • /usr/bin 则包含了更多的用户级命令和应用程序,这些命令可能不是系统运行所绝对必须的,但在日常操作中非常有用。例如,开发工具、文本编辑器和其他实用程序通常会安装在 /usr/bin 下。
  3. 权限和访问:
    • 通常,只有具有超级用户权限(root)的用户才能向 /usr/bin 目录添加或删除文件。这是为了防止普通用户误操作或恶意操作影响系统的正常运行。
  4. 环境变量:
    • /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开发板,加权限,运行即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构初阶】二叉树---堆

二叉树-堆的实现 一、树的概念&#xff08;什么是树&#xff09;二、二叉树的概念及结构2.1 二叉树的概念2.2 二叉树的性质2.3 二叉树存储结构 三、二叉树的顺序结构3.1 堆的概念及结构3.2 堆的向下调整算法3.3堆的创建 四、堆的代码实现4.1 堆的初始化4.2 堆的销毁4.3 堆的插入…

如何从iconfont中获取字体图标并应用到微信小程序中去?

下面我们一一个微信小程序的登录界面的制作为例来说明&#xff0c;如何从iconfont中获取字体图标是如何应用到微信小程序中去的。首先我们看效果。 这里所有的图标&#xff0c;都是从iconfont中以字体的形式来加载的&#xff0c;也就是说&#xff0c;我们自始至终没有使用一张…

jenkins 自动化部署Springboot 项目

一、安装docker 1.更新yum命令 yum -y update2.查看机器有残留的docker服务&#xff0c;有就卸载干净 查看docker 服务 rpm -qa |grep docker卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/contai…

linux下的进程等待(wait、waitpid)

目录 引言 进程等待的必要性 见见猪跑&#xff1a;是什么 怎么办 多个子进程时 阻塞等待 非阻塞轮询 参数一&#xff1a; 参数二 进程等待的原理 进程退出相关的宏 第三个参数option&#xff08;设置等待的方式&#xff09; 引言 在Linux操作系统中&#xff0c;进程…

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点&#xff0c;不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码&#xff0c;是要在jmeter中用的 keytool -import -ali…

Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

基于SSM+小程序的垃圾分类管理系统(垃圾2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的垃圾分类管理系统实现了管理员及用户。 1、管理员功能结构图&#xff0c;管理员功能有个人中心&#xff0c;管理员管理&#xff0c;基础数据管理、论坛管理、垃圾信息管理…

钰泰ETA4553电压电平转换器IC

描述 ETA4553 是两位同相转换器&#xff0c;是一种双向电压电平转换器&#xff0c;可用于建立混合电压系统之间的数字开关兼容性。它使用两个独立的可配置电源轨&#xff0c;A 端口支持 1.65V 至 5.5V 的工作电压&#xff0c;同时跟踪 VCCA 电源&#xff0c;B 端口支持 2.3V 至…

QT QDialog::exec()调用时清除部件所有焦点

最近在做项目时&#xff0c;遇到一个问题&#xff1a;在统信UOS系统编写的QT程序&#xff0c;其中进入某些页面时&#xff0c;或者显示模态窗时&#xff0c;按钮都会有一个焦点框&#xff0c;这个是不允许的&#xff0c;于是乎&#xff0c;开始了清理焦点的旅途。 一、清理QDia…

高速自爆穿梭无人机技术详解

高速自爆穿梭无人机技术是一种结合了高速飞行与自爆式攻击能力的先进无人机技术。以下是对该技术的详细解析&#xff1a; 一、技术特点 1. 高速飞行&#xff1a; 高速自爆穿梭无人机通常具备极高的飞行速度&#xff0c;如部分型号的速度可达到174公里/小时&#xff0c;甚至更…

五,Linux基础环境搭建(CentOS7)- 安装Kafka

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Kafka 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、Kafka下载及安装 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高…

[ARC159D] LIS 2 题解

[ARC159D] LIS 2 题面&#xff1a; 题面翻译 给定 n n n 个操作&#xff0c;每次操作给出 l , r l,r l,r&#xff0c;并在 a a a 序列里依次添加 i ∈ [ l , r ] i\in[l,r] i∈[l,r]。 求最后 a a a 的最长上升子序列。 题目描述 数列 $ X $ があります。初め、$ X $ は空…

网络搜索引擎Shodan(1)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shodan(1)_哔哩哔哩_bilibili 本文主要讲解网络搜索引擎Shodan的一些用法&#xff08;host和search这两个命令&#xff09;。 Shodan 是一个网络…

Matlab学习02-matlab中的数据显示格式及符号变量

目录 一&#xff0c;关系运算和逻辑运算 二&#xff0c;变量 三&#xff0c;数据显示格式 四&#xff0c;符号运算 1&#xff0c;创建符号变量 2&#xff0c;数值矩阵转换成符号矩阵 一&#xff0c;关系运算和逻辑运算 在matlab中&#xff0c;只要数值不是 &#xff0…

jenkins下拉参数联动

需要安装Active Choices插件&#xff0c;官网地址&#xff1a; https://plugins.jenkins.io/uno-choice/ 安装完插件以后会出现Active Choices选项&#xff1a; 第一个参数&#xff1a; return ["dubbo-op-all-deployment1", "dubbo-op-all-deployment2",…

合并数组的两种常用方法比较

在 JavaScript 中&#xff0c;合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点&#xff1a; 易于理解&#xff1a;使用扩展运算符的语法非常直观&#xff0c;表达了“将两个数组合并成一个…

基于vue框架的的高校消防设施管理系统06y99(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备分类,设备信息,维修人员,报修信息,维修进度,院系,消防知识,培训记录,培训信息,备件信息,备件申请,派发信息,采购信息 开题报告内容 基于Vue框架的高校消防设施管理系统开题报告 一、项目背景与意义 随着高校规模的不断扩大和校园建…

基于Django+Python的房屋信息可视化及价格预测系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

无人机喊话器详解!

喊话器材料 外壳常采用尼龙纤维增强材料&#xff0c;这种材料具有抗摔、抗震、轻便、灵活、质量稳定、操作简单等优点&#xff0c;能够满足不同场景的需求。 喊话范围 无人机喊话器的喊话范围主要取决于设备的型号、环境条件以及喊话器的性能参数。一般来说&#xff0c;无人…

【334】基于springboot的仓库管理系统

本科毕业设计论文 题目&#xff1a;仓库管理系统设计与实现 摘 要 信息内容数据从传统到当今&#xff0c;一直在改变&#xff0c;忽然互联网技术让传统信息内容管理见到划时代的黎明&#xff0c;由于传统信息内容管理从时效性、安全系数、可执行性等多个方面&#xff0c;碰到…