SQLite下载、编译和使用-3

\color{green}{文章付费是对Copyleft精神的亵渎,阅后点赞、关注才是对作者最大的奖赏!---Devil}


May you do good and not evil.
May you find forgiveness for yourself and forgive others.
May you share freely, never taking more than you give.

SQLite源码下载

 SQLite代码完全开源,可直接访问SQLite官网提供的下载地址SQLite源码下载进行源码的下载。其下载源码有多种类型,在这里推荐两种类型(支持点我下载,最新版本3.28.0,更新后可能失效):

  1. amalgamation合并型Src:该方法下载到的源码文件中只有sqlite3.c、sqlite3.h、sqlite3ext.h、shell.c四个文件,非常方便在自己的工程代码中集成该源码,集成方法继续往后阅读。
  2. arch源码树型Src:该方法下载到的源码是Arch版本的,不同功能的文件被整理到不同文件夹下,更符合我们的阅读习惯,在学习SQLite源码时,更建议使用该类型的下载方法下载源码。

我们的事例采用虚拟机上安装centos7的linux环境编译和调试,作为一个程序猿,使用Linux的重要性参考大学四年一文,如果你志向与windows\IOS开发,请忽略并继续。如何在虚拟机上安装Centos7网上很多方法,此处不做介绍,有问题可留言,力所能及处必解答。
代码上传CentOS方法可参考:

  1. 使用secureCRT软件ssh登录centos7服务器(非常通用的工具,使用方法不再赘述),使用rz命令上传windows本地tar文件;
  2. 使用VMware workstation的ShareFileFolder功能。
    2.1 具体步骤为 【打开VMware】- 【虚拟机(M)】- 【设置】,打开虚拟机设置页面,选择【选项】-【共享文件夹】,添加文件夹映射。
    2.2 共享的文件夹一般被挂载到centos系统的/mnt/hgfs目录下,将安装包放置到该共享文件夹下,linux系统上直接访问即可

SQLite源码编译

一、使用arch型源码编译

 下载到的源码解压并执行configure得到该平台下的Makefile后,直接make即可

[root@localhost sqlite3] tar -zxvf sqlite-src-3280000.zip
--我这边解压并重命名等处理后,源码位于sqlite-src-arch
[root@localhost sqlite3]# ls
sqliteOne sqlite-src-arch
[root@localhost sqlite3]# cd sqlite-src-arch/
[root@localhost sqlite-src-arch]# ./configure
[root@localhost sqlite-src-arch]# make

make后在该目录下生成sqlite3.c、sqlite3.h、sqlite3ext.h、shell.c四个源文件和1个sqlite可执行程序。

二、使用amalgamation型源码编译

 下载源码解压后得到四个源文件,本次解压到sqliteOne文件夹下:

[root@localhost sqlite3]# ls
sqliteOne sqlite-src-arch
[root@localhost sqlite3]# cd sqliteOne/
[root@localhost sqliteOne]# ls
shell.c sqlite3.c sqlite3ext.h sqlite3.h

2.1 使用这四个文件编译出sqlite3可执行程序:

[root@localhost sqliteOne]# gcc shell.c sqlite3.c -o sqlite3 -lpthread -ldl -lrt
[root@localhost sqliteOne]# ls
shell.c sqlite3 sqlite3.c sqlite3ext.h sqlite3.h
[root@localhost sqliteOne]# ./sqlite3
SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
\color{red}{ gcc -o指定编译生成的可执行程序名称;-l加链接的库的名称;至于为什么要指定链接这些库,主要是因为sqlite程序依赖这几个库}

2.2 将sqlite3源代码加入到自己的项目中:

2.2.1 直接使用
 将sqlite3.c、sqlite3.h、sqlite3ext.h直接加到自己的工程中,#include头文件后即可使用
2.2.2 静态链接库使用
 首先要生成libsqlite3.a静态库,然后在自己的工程中-lsqlite3静态链接该库即可

[root@localhost sqliteOne]# gcc -c sqlite3.c
[root@localhost sqliteOne]# ar -crus libsqlite3.a sqlite3.o
[root@localhost sqliteOne]# gcc test.c -L . -lsqlite3 -lpthread -lrt -ldl
[root@localhost sqliteOne]# ./a.out
Create/Open test.db success!
classno: 19061214
name: dianzi
personNum: 30
\color{red}{gcc -c将sqlite3.c仅编译不链接,生成中间sqlite3.o}
\color{red}{ar 命令将生成的.o文件打包成静态链接库libsqlite3.a}
\color{red}{gcc -L .指定链接静态库搜索当前路径,-lsqlite3链接上一步生成的静态库libsqlite3.a}

2.2.3 动态链接库使用
 首先要生成libsqlite3.so动态库,然后在自己的工程中-lsqlite3静态链接该库

[root@localhost sqliteOne]# gcc sqlite3.c -fPIC -shared -o libsqlite3.so
[root@localhost sqliteOne]# gcc test.c -L . -lsqlite3 -lpthread -lrt -ldl
[root@localhost sqliteOne]# ./a.out
./a.out: error while loading shared libraries: libsqlite3.so: cannot open shared object file: No such file or directory

生成的可执行程序运行后报错cannot open shared object file.
解决方法可以网上搜到很多解决方案,比如:

  1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
    ln -s /where/you/install/lib/*.so /usr/lib

但对于有些同学linux环境受权限限制,可能没有该权限,有没有更好的办法呢?当然是有的:

[root@localhost sqliteOne]# gcc test.c -lpthread -lrt -ldl -L . -lsqlite3 -Wl,-rpath=./
[root@localhost sqliteOne]# ./a.out
Create/Open test.db success!
classno: 19061214
name: dianzi
personNum: 30

\color{red}{gcc -Wl 表示编译器将后面的参数传递给链接器ld,用rpath为程序添加一个运行时库文件搜索路径}

示例代码

test.源码如下,仅用于说明编译链接方法,实际使用尽量避免sqlite3_exec的使用,效率极其低下。

#include <stdio.h>
#include "sqlite3.h"
#include <stdlib.h>
#include <string.h>

int callback(void* data, int ncols, char** values, char** headers)  
{  
    int i;  
    int len =0;  
    int ll=0;  
    for(i=0; i < ncols; i++)  
    {  
        if(strlen(headers[i])>len)  
            len = strlen(headers[i]);  
    }  
      
    for(i=0; i < ncols; i++)   
    {  
        ll = len-strlen(headers[i]);  
        while(ll)  
        {  
            fprintf(stdout," ");  
            --ll;  
        }  
        fprintf(stdout, "%s: %s\n", headers[i], values[i]);  
    }  
  
    fprintf(stdout, "\n");  
    return 0;  
}  
int main()
{
    sqlite3 *db = NULL;
    int result;
    result = sqlite3_open("./test.db",&db);
    if(result != SQLITE_OK)
    {
        printf("Create/Open test.db error!\n");
        return -1;
    }
    printf("Create/Open test.db success!\n");


    const char* sqlStr1 = "select * from class limit 3;";
    result = sqlite3_exec(db,sqlStr1,callback,0,0);
    if(result != SQLITE_OK)
    {
        printf("select table class error!\n");
        return -1;
    }
    printf("select table class success!\n");
    sqlite3_close(db);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容