到sqlite3官网下载源码。
下载整合版本。有几个源文件。其中sqlite3.c是主要的,有261045行代码,太厉害了。
shell.c
sqlite3.c
sqlite3.h
sqlite3ext.h
直接放在项目里编译不太好,所以把它做成库文件使用
在目录下执行命令,下面的命令生成目标文件sqlite3.o
生成静态库文件libsqlite3.a,要遵守命名规则,加上lib前缀并且后缀名是.a
把生成的库文件放在自定义目录里,使用时就直接使用-L参数指定库目录和-l参数指定库文件编译就行了,注意-l指定库文件名称不需要加lib前缀和.a后缀的
我再codelite这个集成开发环境里就这样设置,只针对单独项目的话,把sqlite的头文件和库文件拷贝到项目目录里。弄一个单独的sqlite3文件夹
在项目配置里设置头文件目录
设置库文件目录和链接库文件
这样在项目代码里直接包含头文件用就行了。会调用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;
}
正常输出结果