Ubuntu18.04中编译SQLite3库

1 概述

熟悉C语言编程的小伙伴们应该都知道,我们在采用C语言开发项目时,一般会包括头文件、源文件或者库文件。那么这些文件主要存储什么内容呢,这里给大家简单介绍一下。

头文件中主要包括函数的声明,告诉编译器存在某些函数。

源文件中主要包括函数的实现,即具体是做什么的。

这两个文件都比较好理解,下面重点介绍一下库文件。通常我们在开发好一个项目后,希望用户可以正常调用我们开发好的API,但是又不希望他们看到具体的函数实现。此时我们就可以将函数实现部分打包成一个库,用户在拿到库文件和头文件后即可调用,而不需要源文件。因此,函数实现部分也可以放在库文件中。库文件具体可以分为动态链接库和静态链接库。在Windows中分别是以.so和.a结尾;在Linux中分别是以.dll和.lib结尾。

然后我们再简单介绍一些Linux系统中的文件管理部分。Linux系统中的的头文件主要放置在/usr/local/include和/usr/include两个文件夹中,它们都属于系统头文件,因此我们在调用时使用“< >”来包围头文件名称,例如“#include <stdio.h>”;如果头文件没有放置在这两个文件夹中,那么我们在调用时使用““ ””来包围头文件名称。Linux系统中的库文件主要放置在/usr/lib文件夹中

2 下载源代码

进入SQLite下载官网下载源代码,这里我们下载包含配置文件的,如下图所示

下载 完成后会得到一个以.tar.gz结尾的压缩文件,这里我下载得到的压缩文件名是sqlite-autoconf-3380200.tar.gz。

3 编译SQLite3库

下载好源代码后,下面开始编译SQLite3,生成库文件。具体步骤如下:

1. 解压:提供两种方法:1)终端解压:切换至压缩文件目录,输入命令

tar -xavf 压缩文件名

所以我对应的指令就是

扫描二维码关注公众号,回复: 14618765 查看本文章
tar -xzvf sqlite-autoconf-3380200.tar.gz

2)鼠标右键压缩文件,单击提取到此处(汉化)或Extract即可。

2. 创建新的文件夹,用于保存编译生成的sqlite库文件,头文件和可行性命令文件。我创建在/home/fly/APP文件夹下,文件名为sqlite3,因此完整路径为/home/fly/APP/sqlite3。

3. 进入解压后的文件夹,即sqlite-autoconf-3380200,执行配置 指令,用于生成MakeFile文件。

./configure --prefix=/home/fly/APP/sqlite3

上述指令中prefix用于指定sqlite库文件,头文件和可行性命令文件的安装路径,其实就是我们上一步创建的文件夹路径。

4. 执行编译指令

make

这一步其实就是找到我们上一步执行配置指令后生成的MakeFile文件,并执行该文件。因此只有存在MakeFile文件(无后缀)时才能执行编译指令,要切记!

5. 执行安装指令

make install 

执行完成以后,此时之前创建的文件夹中会自动生成4个文件夹,分别是bin,include,lib,share。其中

bin文件夹中一般存放可执行程序;

include文件夹中存放头文件;

lib文件夹中存放库,即函数的实现(.a静态库,.so动态库);

share文件夹中存放帮助文件等辅助性的文件。

此时我们已经完成了整个编译过程。

4 移植

此时如果我们想要使用sqlite3,直接导入头文件即可(头文件sqlite.h在include文件夹下),但是导入的时候需要使用“ “ ” ”来包围头文件名。我们在概述中说过,如果头文件位于系统目录下则可以使用“ < > ”来包围头文件名,因此可以将头文件和库文件统一移植到系统目录下,这样可以更加方便调用。具体移植过程如下:

1. 进入include文件夹,执行以下拷贝指令,将所有的头文件拷贝到/usr/inclucde文件夹中。

cp * /usr/include/

2. 进入lib文件夹,执行以下拷贝指令,将所有的库文件拷贝到/usr/lib文件夹中。

cp libsqlite3.* /usr/lib/

5 测试

创建一个.c文件,假设文件名为sqlitetest。

sudo gedit sqlitetest.c

然后将C语言操作SQLite中的第4部分《C代码-创建表》中的代码复制进来。

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
 
int main(int argc, char *argv[]){
    sqlite3 *db; //数据库
    char *errormsg;
    char **result;
    int row, column;
    int ret;
    
    ret = sqlite3_open("NBA.db", &db); //打开数据库
    if (ret != SQLITE_OK){
        printf("open failed!\n");
        return -1;
    }
 
    ret = sqlite3_exec(db, "CREATE TABLE Lakers(Name TEXT NOT NULL UNIQUE, \
            Height REAL NOT NULL, PointsPerGames REAL NOT NULL);",\
            NULL, NULL, &errormsg);
    if (ret != SQLITE_OK){
        printf("%s\n", errormsg);
        sqlite3_free(errormsg);
    }
 
    ret = sqlite3_exec(db, "INSERT INTO Lakers (Name, Height, PointsPerGames)\
            VALUES('James', 2.03, 27.8);", NULL, NULL, &errormsg);
    if (ret != SQLITE_OK){
        printf("%s\n", errormsg);
        sqlite3_free(errormsg);
    }
 
    ret = sqlite3_get_table(db, "SELECT * FROM Lakers;", &result, &row, &column,             
                         &errormsg); 
    if (ret != SQLITE_OK){
        printf("%s\n", errormsg);
        sqlite3_free(errormsg);
    }else{
        printf("row:%d, column:%d", row, column);
        int i = 0;
        for (i=0; i<(row+1)*column; i++){
            printf("%s ", result[i]);
            if ((i+1)%column == 0)
                printf("\n");
        }
    }
 
    sqlite3_close(db); //关闭数据库
 
    return 0;
}

6 编译

执行以下编译指令对sqlitetest.c文件进行编译

gcc sqlitetest.c -lsqlite3

上述指令中-lsqlite3为链接库,编译时一定要添加,否则会报错

猜你喜欢

转载自blog.csdn.net/weixin_46133643/article/details/123998474
今日推荐