本文简述了SQLite的概念,并详细描述了SQLite在Linux和Windows平台下的编译方法

关于 SQLite

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。

就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

SQLite3命令

与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:

DDL - 数据定义语言

命 令 描    述
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表
DROP 删除整个表,或者表的视图,或者数据库中的其他对象

DML - 数据操作语言

命 令 描    述
INSERT 创建一条记录
UPDATE 修改记录
DELETE 删除记录

DQL - 数据查询语言

命 令 描    述
SELECT

从一个或多个表中检索某些记录

SQLite3的源码

关于SQLite3的源码下载请移步SQLite官网下载:

SQLite3 在Linux下的编译

本文的编译环境如下:

编译命令行管理工具

gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3  //将生成sqlit3命令行管理工具

关于libsqlite3.so共享库的编译与使用

编译

gcc -o sqlite3.o sqlite3.c -c -fPIC -lpthread –ldl  
gcc -o libsqlite3.so sqlite3.o -shared

-fPIC:PIC(Position-Independent Code),表示编译为位置独立的代码,在产生的代码中,没有绝对地址,全部使用相对地址,因此代码可以被加载至内存的任意位置。不用此选项的话编译后的代码是位置相关的,再加载时根据加载到的位置再次重定位.所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-shared:表示生成一个共享目标文件(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),即我们所说的共享库(动态链接库)。它可以和其他目标文件连接产生可执行文件。只有部分系统支持该选项。

-lpthread:用于确保SQLite是线程安全的。但因为命令行工具是单线程的,对命令行工具则可编译成非线程安全的,可以忽略pthread库。

gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -o sqlite3

-ldl:用于支持动态装载,sqlite3_load_extension()接口和SQL函数load_extension()需要用到它。如果不需要这些特性,可以使用SQLITE_OMIT_LOAD_EXTENSION编译选项来忽略

gcc -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3

使用

在你的程序中(例如test.c)通过包含头文件sqlite3.h来使用库中的函数,编译程序的命令为

export LD_LIBRARY_PATH=共享库所在目录
gcc test.c -L. -lsqlite3 -o test

-L. : 告诉编译器在当前目录(.)中查找共享函数库

-lsqlite3:  指明编译器查找共享库libsqlite3.so,编译器查找共享库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。

通过ldd test可查看test程序是如何调用共享库中的函数的,当未指定LD_LIBRARY_PATH时,共享库libsqlite3.so是找不到的。

编译和使用静态库

gcc -o sqlite3.o -c sqlite3.c -lpthread -ldl  //编译成目标文件
ar -rcv libsqlite3.a sqlite3.o   //将列出的各个目标文件一起打包成一个静态库libsqlite3.a
gcc -o test test.c -L. -lsqlite3 –static   //链接静态库,也可不加-static选项

-static:添加static后会将库也包含在目标文件中,使得目标文件体积非常大,下图为两者的区别

note: 关于ar命令

ar [-]p[mod] [……] archive [member...]

p:该参数描述了接下来要执行的操作,具体操作命令如下,但在单次命令执行过程中,只能选择其中一个

参 数

描    述

参 数

描    述

d

从文件包中删除文件

r

在文件包中代替文件

m

从文件包中移动文件到包尾

t

列出包中文件名为files指明的文件名的文件内容

p

打印出文件包中的文件

x

从文件包中解压出文件名为files指明的文件

q

在文件包尾加入文件

   

[mod]:若干关键字跟随在p参数后,用于描述施加在操作行为上的变化

参 数

描    述

参 数

描    述

a

与r或m共同使用来将files指明的文件放置于posname之后

s

强制重新生成文件包的符号表

b

与a作用相同,但是是在posname之前使用

T

只在Solaris中有这个参数.在不支持长文件名的文件系统中减短长文件名.

没有这个操作的话,长文件的解压结果是错误的

c

无提示模式创建文件包

u

与r共同使用,用来仅取代那些在生成文件包之后改动过的文件

i

与b相同

v

细节化,并打印一个文件包的描述

note: 当静态库与共享库同名时,优先使用共享库

SQLite在windows下编译(VS2019)

静态编译库文件

创建新项目

将下载的文件添加到项目中,本项目配置选用Release, x64版本

增加预处理定义

_USRDLL

SQLITE_ENABLE_RTREE

SQLITE_ENABLE_COLUMN_METADATA

SQLITE_ENABLE_FTS5

SQLITE_ENABLE_UNLOCK_NOTIFY

添加并修改模板定义文件 sqlite3.def

修改模块定义文件:在最后追加 sqlite3_unlock_notify

配置类型改为静态库lib

生成解决方案

在项目路径的\x64\Release文件下,即可找到.lib文件

创建测试工程

将上一步生成的.lib文件,连同sqlite3.h和sqlite3ext.h共同添加到项目当中

设置头文件包含路径及库路径,此处的路径分别为头文件(sqlite3.h和sqlite3ext.h)存放路径和库文件(.lib)存放路径

编辑测试代码

添加main.cpp文件,编辑测试代码

 #include <stdio.h>
#include "sqlite3.h"
#pragma comment(lib,"test_sqlite_lib") /* print a record from table outputed by sql statement */
static int callback(void* NotUsed, int argc, char** argv, char** azColName) {
int i;
for (i = ; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return ;
} int main(int argc, char** argv) {
sqlite3* db;
char* zErrMsg = ;
int rc; if (argc != ) {
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[]);
return();
}
rc = sqlite3_open(argv[], &db); /* open database */
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return();
}
rc = sqlite3_exec(db, argv[], callback, , &zErrMsg); /* execute SQL statement */
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db); /* close database */
return ;
}

编译后生成test_sqlite.exe程序,它的运行依赖于sqlite3.dll。注意程序中也可以不使用pragma指令导入sqlite3.lib,而是在test项目属性中添加对上面的dll项目sqlit3的引用。
这个C程序的例子显示怎么使用sqlite的C/C++接口。数据库的名字由第一个参数取得,第二个参数是一条或更多的SQL执行语句。这个程序调用sqlite3_open()打开指定的数据库,调用sqlite3_exec()对数据库执行SQL语句,callback函数会作用在SQL语句结果集的每条记录上。最后用sqlite3_close()关闭数据库连接。

编译并执行

在VS环境实测过程中,在工具选项卡中打开命令行,在.exe文件路径下执行以下命令即可

主要参考:

SQLite 教程

WIN10 VS2019下编译GDAL3.0+PROJ6+SQLite

SQLite安装、编译与应用

sqlite 安装与编译的更多相关文章

  1. SQLite安装、编译与应用

    什么是 SQLite SQLite是一款轻量级的.基于文件的嵌入式数据库,实现自包容.零配置.支持事务的SQL数据库引擎.与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下, ...

  2. sqlite安装与封装后编译

    ========================安装sqlite=================官网下载安装包*.tar.gz格式./configure --prefix=/usr/server/s ...

  3. 安装maven编译环境

    安装maven编译环境 1.默认已经装好yum并配置好yum源(推荐使用163yum源) 2.安装JDK 3.安装相关依赖环境(root用户登陆) yum install -y cmake lzo-d ...

  4. CentOS离线安装GCC编译环境

    gcc编译环境rpm下载 安装相关的rpm包,具体版本可能随时间变化而变化,可以去以下地址下载: 重庆大学镜像:http://b.mirrors.lanunion.org/CentOS/中国科学技术大 ...

  5. windows平台下安装、编译、使用mongodb C++ driver

    本博客将记录在Win8.1 ,VS2013环境下编译.配置mongodb C++ driver的流程. 1.下载预备 下载Boost:http://sourceforge.net/projects/b ...

  6. eclipse安装反编译工具

    身为一名程序员来说,日常最常做的就是编写代码和查看别人写好的源代码了,有时候打开别人写的class文件发现根本不是自己想要的,所以给大家介绍一种eclipse中反编译class文件的工具. 第一步:下 ...

  7. [转]Caffe在Linux下的安装,编译,实验

    Caffe在Linux下的安装,编译,实验  原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...

  8. python 安装预编译库注意事项-pip

    一般安装依赖库用pip install 库名 就可以,某些情况下依赖的库需要安装预编译好的, 可以参考pip 安装时的错误信息 下面这个链接中可以直接下载 http://www.lfd.uci.edu ...

  9. WebStorm 8.0安装LESS编译环境的教程

    WebStorm是一个非常棒的Web前端开发编辑器,被程序猿们成为“最智能的JavaScript IDE”.对HTML5.Bootstrap框架.Node.js等都有完美支持.目前最新版本为WebSt ...

随机推荐

  1. redisql 试用

    redisql 是一个redis 模块,可以让redis 支持sql 查询,基于rust编写 具有以下特性 快速,每秒130k的插入 使用标准sql 容易操作,基于redis,使用标准的redis 二 ...

  2. 第02组 Alpha冲刺(4/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...

  3. mpvue图片上传

    mpvue小程序项目中的图片上传 我的csdn博客地址:https://blog.csdn.net/zmkyf1993 一般我是优先更新csdn内容,然后在拷过来的. 效果图 通过mpvue文档得知他 ...

  4. nginx.conf 配置解析之 events配置

    worker_connections 1024; 定义每个work_process同时开启的最大连接数,即允许最多只能有这么多连接. accept_mutex on; 当某一个时刻只有一个网络连接请求 ...

  5. js读取sqlserver数据库,输出至html

    代码: <!DOCTYPE html> <html> <head>   <meta charset="utf-8">   <m ...

  6. 数位dp技巧

    一个奇怪的东西 正反都能dp!: 正常我们数位dp都是从高到低,以这样的方式保证其小于给定数-> ll n; int num[N],l; ll dp[]; ll dfs(int p,int li ...

  7. 分布式系统 与 Google

    google 论文 http://duanple.com/?p=170 google 论文与开源 http://duanple.com/?p=1096 分布式系统论文集 https://github. ...

  8. [Beta阶段]第六次Scrum Meeting

    Scrum Meeting博客目录 [Beta阶段]第六次Scrum Meeting 基本信息 名称 时间 地点 时长 第六次Scrum Meeting 19/05/12 大运村寝室6楼 25min ...

  9. 第08组 Alpha冲刺(4/4)

    小李的博客 作业博客 作业链接 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 11月20日了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任务. 实现地图功能 展示Git ...

  10. JVM探究之 —— 垃圾回收(二)

    1. 垃圾收集算法 1.1 标记清除(Mark-Sweep)算法 标记—清除算法是第一种使用和比较完善的垃圾回收算法,后续的收集算法都是基于其设计思路并对其不足进行改进而得到的. 该算法分为“标记”和 ...