在VS2008下编译sqlite3

     废话就不多说了,直接进入主题。

    1、进入http://sqlite.org/download.html下载sqlite-amalgamation-3071300.zipsqlite-dll-win32-x86-3071300.zip,解压;

    2、创建一个空的win32 dll项目,将解压缩的文件添加进来,进行编译,没有报错,但是查看编译目录,发现只是生成了sqlite3.dll而不见sqlite3.lib文件;

    3、项目属性--配置属性--连接器--输入--模块定义文件,添加sqlite3.def,返回再次编译,发现编译器报如下错误:

         正在链接...
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_origin_name16
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_table_name16
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback
        sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_table_column_metadata
        D:\HHTDEV\C++\Sqlite\Debug\sqlite3.lib : fatal error LNK1120: 8 个无法解析的外部命令

        解决办法,项目属性--配置属性--C/C++ -- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_COLUMN_METADATA,

        再次编译时,还是报错,sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback,同样是缺少一个宏定义,

        项目属性--配置属性--C/C++ -- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_RTREE,

        再次编译,没有问题。

        另一个解决办法是,在sqlite3.c文件添加如下宏定义,

        //add two micro
        #define SQLITE_ENABLE_RTREE  
        #define SQLITE_ENABLE_COLUMN_METADATA

        以上两个方法是等效的。看个人习惯了。

4、网上有提供另外一种方法来生成lib文件,lib /def:sqlite3.def /machine:ix86,lib.exe在VS的安装目录VC下的bin目录中,我尝试过这个方法,但是没有成功,报缺少一个dll文件,可能和个人安装操作系统时缺省了那个dll文件吧,你也可以尝试一下这个办法。

5、接下来是验证我们生成的动态库是否可用了,

       sqlite官网提供了一个例子,我稍作修改如下:

     

#include "stdafx.h"
#include <stdio.h>  
#include "sqlite3.h"  
#include <process.h>
#pragma comment(lib,"sqlite3.lib")  

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
	int i;
	for(i=0; i<argc; i++){
		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
	}
	printf("\n");
	return 0;
}

int _tmain(int argc, char* argv[])
{
	sqlite3 *db;
	char *zErrMsg = 0;
	int rc;

	if( argc!=2 ){
		fprintf(stderr, "Usage: %s DATABASE\n", argv[0]);
		system("pause");
		return(1);
	}
	rc = sqlite3_open(argv[1], &db);
	if( rc ){
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return(1);
	}

	//char* sqlstatement = "create table test(int id,varchar name);";
	//char* sqlstatement = "insert into test values(1,'hello');";
	char* sqlstatement = "select * from test;";
	rc = sqlite3_exec(db, sqlstatement, callback, 0, &zErrMsg);
	if( rc!=SQLITE_OK ){
		printf("%s\n",argv[2]);
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);
	}
	sqlite3_close(db);

	system("pause");
	return 0;
}

测试结果,OK。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值