zoukankan      html  css  js  c++  java
  • sqlite 安装与编译

    本文简述了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官网下载:

    image

    image

    image

    SQLite3 在Linux下的编译

    本文的编译环境如下:

    clipboard

    编译命令行管理工具

    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是找不到的。

    image

    image

    编译和使用静态库

    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后会将库也包含在目标文件中,使得目标文件体积非常大,下图为两者的区别

    clipboard

    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)

    静态编译库文件

    创建新项目

    clipboard[1]

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

    clipboard[2]

    clipboard[3]

    增加预处理定义

    _USRDLL

    SQLITE_ENABLE_RTREE

    SQLITE_ENABLE_COLUMN_METADATA

    SQLITE_ENABLE_FTS5

    SQLITE_ENABLE_UNLOCK_NOTIFY

    clipboard[4]

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

    clipboard[5]

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

    image 7

    配置类型改为静态库lib

    clipboard[6]

    生成解决方案

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

    创建测试工程

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

    clipboard[7]

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

    clipboard[8]

    编辑测试代码

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

     1 #include <stdio.h>  
     2 #include "sqlite3.h"  
     3 #pragma comment(lib,"test_sqlite_lib")  
     4 
     5 /* print a record from table outputed by sql statement */
     6 static int callback(void* NotUsed, int argc, char** argv, char** azColName) {
     7     int i;
     8     for (i = 0; i < argc; i++) {
     9         printf("%s = %s
    ", azColName[i], argv[i] ? argv[i] : "NULL");
    10     }
    11     printf("
    ");
    12     return 0;
    13 }
    14 
    15 int main(int argc, char** argv) {
    16     sqlite3* db;
    17     char* zErrMsg = 0;
    18     int rc;
    19 
    20     if (argc != 3) {
    21         fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT
    ", argv[0]);
    22         return(1);
    23     }
    24     rc = sqlite3_open(argv[1], &db);  /* open database */
    25     if (rc) {
    26         fprintf(stderr, "Can't open database: %s
    ", sqlite3_errmsg(db));
    27         sqlite3_close(db);
    28         return(1);
    29     }
    30     rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);  /* execute SQL statement */
    31     if (rc != SQLITE_OK) {
    32         fprintf(stderr, "SQL error: %s
    ", zErrMsg);
    33         sqlite3_free(zErrMsg);
    34     }
    35     sqlite3_close(db);  /* close database */
    36     return 0;
    37 }

    编译后生成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文件路径下执行以下命令即可

    clipboard[9]

     

    主要参考:

    SQLite 教程

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

    SQLite安装、编译与应用

  • 相关阅读:
    Javascript的作用域、作用域链以及闭包
    C#当中的泛型和java中的对比
    MongoDB的主从复制和副本集
    MongoDB启动配置等
    JavaScript学习系列1 基础-变量
    Umbraco项目发布错误 --More than one type want to be a model for content type authorize
    项目中gulp使用发生的错误及解决
    JavaScript学习系列2一JavaScript中的变量作用域
    ASP.NET MVC中的ActionFilter介绍学习
    Razor中的 内容标记块语法
  • 原文地址:https://www.cnblogs.com/luego/p/11542420.html
Copyright © 2011-2022 走看看