支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索
HelloWorld论坛 : > 计算机科学、技术、教学> 编程专题> 数据库> [转]VS2008 生成sqlite3动态连接库及sqlite3.dll的调用
 
 
 
 
类别:数据库 阅读:6661 评论:0 时间:六月 17, 2013, 11 a.m. 关键字:sqlite3 vs2008

 

来源:http://blog.sina.com.cn/s/blog_841eaed801012krp.html
作者:Jiffies
一,生成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添加到项目的源文件下面。
VS2008 <wbr>生成sqlite3动态连接库及sqlite3.dll的调用
 
5,编译即可以得来sqlite3.dll文件
   注意,此时,并未有sqlite3.lib生成,解决方法如下:
   在项目属性中如下配置:
VS2008 <wbr>生成sqlite3动态连接库及sqlite3.dll的调用
 
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++_Program\sqlite3\Debug\sqlite3.lib : fatal error LNK1120: 8 个无法解析的外部命令
解决办法是:
 修改项目属性的配置,在预处理器定义中添加SQLITE_ENABLE_COLUMN_METADATA
再次编译,此时仍然会报一个:
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的源码:
 
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
        char *errMsg;
        int rc;
        sqlite3 *db;
        rc = sqlite3_open("manage.db", &db);
        if(rc == SQLITE_OK)
        {
                MessageBox(NULL,_T("打开数据库成功!"), _T("消息"), MB_OK|MB_ICONWARNING);
                rc = sqlite3_exec(db,"create table if not exist user(ID integer,name varchar(32))",NULL,NULL,&errMsg);
                if(rc != SQLITE_OK)
                {
                        printf("创建表失败,错误码:%d,错误原因:%s\n",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;
} 
 
[挂载人]初学MPEG

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment