您的位置:首页 > 数据库

VS2013 生成sqlite3动态连接库及sqlite3.dll的调用

2015-03-05 11:44 323 查看
一,生成sqlite3动态连接库

1,去sqlite官网上下载最近的sqlite源码包,解压后得到四个文件:shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h

此处还需要sqlite3.def文件,它在sqlite官方生成的dll包中,下载下来,解压即可。

其中,shell.c文件是做来生成exe可执行文件用的。

2,打开vs2008 新建sqlite3的非mfc的DLL项目,这里只需要建立空的项目即可。

3,将上面非shell.c的四个文件复制动sqlite3项目工程的目录下

4,将sqlite3.h,sqlite3ext.h两文件添加到项目的头文件下面,把sqlite3.c,sqlite3.def添加到项目的源文件下面。

5,编译即可以得来sqlite3.dll文件

注意,此时,并未有sqlite3.lib生成,解决方法如下:

6,再次编译:

出现如下错误:

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name16

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name16

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_table_column_metadata

1>F:C++_Programsqlite3Debugsqlite3.lib : fatal error LNK1120: 8 个无法解析的外部命令

解决办法是:

修改项目属性的配置,在预处理器定义中添加SQLITE_ENABLE_COLUMN_METADATA(配置属性-> c/c++ -> 预处理器 -> 预处理器定义)

再次编译,此时仍然会报一个:

1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback

的错误,解决办法是:

在预处理器定义中添加:SQLITE_ENABLE_RTREE

再次编译即会成功生成sqlite3.dll和sqlite3.lib文件

二,生成sqlite3可执行文件

若要生成sqltie3.exe可执行文件,只需新建win32控制台空项目,要将 sqlite3.c,sqlite3.h,shell.c引入源文件中,如下:

[转载]VS2008 <wbr>生成sqlite3动态连接库及sqlite3.dll的调用

生成解决方案,就能得到我们需要的sqlite3.exe文件

三,在C++项目中引用sqlite3的动态连接库

1,新建测试工程sqlite3_Test:

2,将上面生成的sqlite3.dll文件放到debug目录中,在项目目录中引入sqlite3.lib文件,

并把sqlite3.h加入到项目头文件中

3,在stdafx.h文件中将sqlite3.h头文件引入

#ifndef SQLITE3

#define SQLITE3

#include "sqlite3.h"

#endif

4,在sqlite3_test.cpp源文件中,写入sqltie3数据库操作:

首先在stdafx.h头文件中加入显示数据库查询结果的回调函数:

int showTableInfo(void *para,int n_column,char **column_value,char **column_name);

修改Sqlite3_Test.cpp的源码:

// sqlite3Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
//在stdafx.h文件中将sqlite3.h头文件引入
#ifndef SQLITE3
#define SQLITE3
#include "sqlite3.h"
//首先在stdafx.h头文件中加入显示数据库查询结果的回调函数:
int showTableInfo(void *para, int n_column, char **column_value, char **column_name);
#endif

int _tmain(int argc, _TCHAR* argv[])
{
char *errMsg;
int rc;
sqlite3 *db;
rc = sqlite3_open("manage1.db", &db);
if (rc == SQLITE_OK)
{
MessageBox(NULL, _T("打开数据库成功!"), _T("消息"), MB_OK | MB_ICONWARNING);
rc = sqlite3_exec(db, "create table if not exists user(ID integer,name varchar(32))", NULL, NULL, &errMsg);
if (rc != SQLITE_OK)
{
printf("创建表失败,错误码:%d,错误原因:%sn", rc, errMsg);
MessageBox(NULL, _T("创建表user失败!"), _T("错误"), MB_ICONWARNING);
}
rc = sqlite3_exec(db, "insert into user values('123','测试')", NULL, NULL, &errMsg);
if (rc != SQLITE_OK)
{
MessageBox(NULL, _T("插入数据失败!"), _T("错误"), MB_ICONWARNING);
}
rc = sqlite3_exec(db, "select * from user", showTableInfo, NULL, &errMsg);
if (rc != SQLITE_OK)
{
MessageBox(NULL, _T("查询失败!"), _T("错误"), MB_ICONWARNING);
}

}
return 0;
}

int showTableInfo(void *para, int n_column, char **column_value, char **column_name)
{
int i;
printf("记录包含%d个字段\n", n_column);
for (i = 0; i<n_column; i++)
{
printf("字段名:%s  >> 字段值:%s\n", column_name[i], column_value[i]);
}
printf("--------------------------------------n");
return 0;
}


下载地址:http://www.sqlite.org/download.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: