0、系统环境
开发环境:VS2008
开发语言:C/C++
1、文件准备
SQLite官网https://www.sqlite.org/index.html下载最新的SQLite相关文件(sqlite3.dll 和 sql3.def),当前最新版本为3.22.0。我们找到windows所对应的Precompiled Binaries forWindows 下载
依据实际情况下载 32位/64位zip文件。sqlite-tools-win32-x86-3220000.zip 是用于管理SQLite数据库文件的一系列命令行工具,此处我们暂时不需要用到它。
在Source Code 栏中下载sqlite-amalgamation-3220000.zip以获取头文件sqlite3.h.
2、静态链接库生成
下载后的sqlite-dll-win32-*-3220000.zip,包含了我们所需要的sqlite3.dll和 sql3.def。解压此下载的zip至文件夹,如D:\4-Temp\temp_obj\sqlit 接着打开CMD命令行。执行以下命令
C:\Users\baiqishi>D:
D:\>cd D:\4-Temp\temp_obj\sqlit
D:\4-Temp\temp_obj\sqlit>lib /DEF:sqlite3.def
运行成功会有如下打印显示
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : warning LNK4068: 未指定 /MACHINE;默认设置为X86
正在创建库 sqlite3.lib 和对象 sqlite3.exp
此时就在当前目录下编译产生了我们所需要的静态链接库sqlite3.lib ,如下图所示
(注意:此处若不成功,请查看后续【异常处理1】)
3、VS工程创建
创建win32控制台工程
将头文件sqlite3.h以及生成的静态链接库文件sqlite3.lib复制到工程文件夹
在工程属性中添加sqlite3.lib库依赖(项目---属性---链接器----输入-----在附加依赖项中添加sqlite3.lib)
源文件如下:
// sqlit2-demo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "sqlite3.h"
#include <iostream>
using namespace std;
int_tmain(int argc, _TCHAR* argv[])
{
int rc = 0;
int i = 0;
sqlite3 *db = NULL;
char *sql = NULL;
char *err = NULL;
rc = sqlite3_open("sqlite3test.db",&db);
if (rc)
{
printf("\r\nopen database sqlite3test.dbfail!\r\nERR: %s", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
printf("\r\nopen databasesqlite3test.db ok!");
sql = "create table stu(id int PRIMARYKEY,name text);";
rc = sqlite3_exec(db, sql, NULL, NULL, &err);
if (SQLITE_OK != rc)
{
if (NULL != err)
{
printf("\r\nSQL1ERR:%s", err);
sqlite3_free(err);
return-1;
}
}
sql = "insert into stu values (1,'zhangsan');";
rc = sqlite3_exec(db, sql, NULL, NULL, &err);
if (SQLITE_OK != rc)
{
if (NULL != err)
{
printf("\r\nSQL2ERR:%s", err);
sqlite3_free(err);
return-1;
}
printf("\r\n error insert");
}
sql = "insert into stu values (2,'lisi');";
rc = sqlite3_exec(db, sql, NULL, NULL, &err);
if (SQLITE_OK != rc)
{
if (NULL != err)
{
printf("\r\nSQL2ERR:%s", err);
sqlite3_free(err);
return-1;
}
printf("\r\n error insert");
}
sql = "select * from stu;";
char **result;
int nrow = 0, ncolumn = 0;
rc = sqlite3_get_table(db, sql, &result, &nrow, &ncolumn,&err);
if (SQLITE_OK != rc)
{
if (NULL != err)
{
printf("\r\nSQL3ERR:%s", err);
sqlite3_free(err);
return-1;
}
printf("\r\n error select");
}
printf("\r\nrow: %d ,column: %d",nrow, ncolumn);
for (i = 0; i<(nrow + 1)*ncolumn;i++)
{
printf("\r\n %s\t %s",result[i++], result[i]);
}
sqlite3_free_table(result);
sqlite3_close(db);
getchar();
return 0;
}
编译完成执行后的结果如下(如编译执行异常,请查看续【异常处理2】)
【异常处理1】:sqlite3.lib静态链接库异常
当我们在CMD命令行执行lib /DEF:sqlite3.def 出现如下所示的“ lib不是内部或外部命令……”异常时
在vs2008的安装目录下(C:\Program Files(x86)\Microsoft Visual Studio 9.0\VC\bin)拷贝 lib.exe 和link.exe到当前执行目录下即可。
注意:此处需要根据实际下载的是32位/64位的SQLite预编译文件来拷贝相应的lib.exe和link.exe。
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin --- 32为
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64 ---64位
或者我们可以不用拷贝这两个执行文件,而采用VS2008所提供的命令行CMD,同样需要根据实际下载的32位/64位的SQLite预编译文件来执行想对应的命令行CMD。如下图所示
上述两种解决方式的效果一样,可以成功编译产生我们所需要的静态链接库文件。
【异常处理2】:编译/运行异常解决
1) “LNK2019:无法解析的外部符号 _sqlite3*……”
出现此类编译异常,是因为当前使用的静态链接库文件的平台与当前VS工程的活动解决方案平台不匹配。简单点说就是两者之间,静态链接库文件是64位的,而当前VS解决方案平台是Win32的,在编译时就会出现上述异常。
此时解决方法是:匹配静态链接库与VS解决方案平台,要么都使用32位的,要么都使用64位的。
上图为修改当前VS解决方案平台的方式,以此来调整平台为32位还是64位
2)运行时出现如下的“0x0000007b”异常
出现上述异常是因为在生成静态链接库时我们所使用的CMD命令行平台与实际的包不匹配所致。
就是说,我们在SQLite官网下载的是64位的dll文件,但是我们在编译产生静态链接库文件时使用的是32位的命令行处理(link.exe、lib.exe为32位的),此时sqlite3.lib静态链接库文件能够正常产生,但是我们在VS中采用Win32平台操作时,程序编译正常,执行的时候就会出现上述错误了。
此时解决方法是:采用匹配的CMD命令行模式去编译产生静态链接库。
小结:在使用SQLite时,我们需要确保
1、SQLite官网下载的dll版本
2、编译产生lib静态链接库时使用的CMD命令行平台
3、VS解决方案平台
上述三者必须保证是统一的平台(32位/64位)