将sqlite3源码使用mingw编译成静态库

⌚Time: 2025-01-18 17:29:00

👨‍💻Author: Jack Ge

sqlite3官网下载源码。

下载整合版本。有几个源文件。其中sqlite3.c是主要的,有261045行代码,太厉害了。

    shell.c
    sqlite3.c
    sqlite3.h
    sqlite3ext.h

直接放在项目里编译不太好,所以把它做成库文件使用

在目录下执行命令,下面的命令生成目标文件sqlite3.o

gcc -c sqlite3.c

生成静态库文件libsqlite3.a,要遵守命名规则,加上lib前缀并且后缀名是.a

ar rcs libsqlite3.a sqlite3.o

把生成的库文件放在自定义目录里,使用时就直接使用-L参数指定库目录和-l参数指定库文件编译就行了,注意-l指定库文件名称不需要加lib前缀和.a后缀的

g++ test.cpp -std=c++11 -L/path/to/lib/ -lsqlite3

我再codelite这个集成开发环境里就这样设置,只针对单独项目的话,把sqlite的头文件和库文件拷贝到项目目录里。弄一个单独的sqlite3文件夹

tree /f sqlite3

├─include
sqlite3.h
sqlite3ext.h

└─lib
        libsqlite3.a

在项目配置里设置头文件目录

设置库文件目录和链接库文件

这样在项目代码里直接包含头文件用就行了。会调用mingw自动编译链接sqlite3库。

有个测试代码


#include <iostream>
#include "sqlite3.h"

static int callback(void* data, int argc, char** argv, char** azColName) {
    // 回调函数,在执行查询语句后被调用
    for (int i = 0; i < argc; i++) {
        std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;
    }
    std::cout << std::endl;
    return 0;
}

int main() {
    sqlite3* db;
    char* errMsg = nullptr;

    // 打开数据库
    int rc = sqlite3_open(":memory:", &db);
    if (rc != SQLITE_OK) {
        std::cout << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
        return rc;
    }

    // 创建表
    std::string createTableSQL = "CREATE TABLE COMPANY("
                                 "ID INT PRIMARY KEY     NOT NULL,"
                                 "NAME           TEXT    NOT NULL,"
                                 "AGE            INT     NOT NULL,"
                                 "ADDRESS        CHAR(50),"
                                 "SALARY         REAL );";
    rc = sqlite3_exec(db, createTableSQL.c_str(), nullptr, nullptr, &errMsg);
    if (rc != SQLITE_OK) {
        std::cout << "无法创建表: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }

    // 插入数据
    std::string insertSQL = "INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) "
                            "VALUES (1, 'tom', 30, 'shanghai', 800.0);";
    rc = sqlite3_exec(db, insertSQL.c_str(), nullptr, nullptr, &errMsg);
    if (rc != SQLITE_OK) {
        std::cout << "无法插入数据: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }

    // 查询数据
    std::string selectSQL = "SELECT * FROM COMPANY;";
    rc = sqlite3_exec(db, selectSQL.c_str(), callback, nullptr, &errMsg);
    if (rc != SQLITE_OK) {
        std::cout << "无法查询数据: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }

    // 关闭数据库
    sqlite3_close(db);
    return SQLITE_OK;
}

正常输出结果

ID = 1
NAME = tom
AGE = 30
ADDRESS = shanghai
SALARY = 800.0