VS2008环境下编译Sqlite源代码
好久没写博客了,趁着这个周末没啥事,就研究了一下Sqlite这个轻量级的数据库,这个数据库是由纯C代码写成的,很适合做轻量级的应用,如嵌入式GIS中数据存储的问题,智能客户端数据存储等等。当然,我主要关注在GIS中的应用。
一、编译Sqlite
1、准备工作
下载源码,这个不用多说,去官方网站下载就好了,当然有的可能说官方网站已经有编译好的二进制包,但是我喜欢直接从源代码编译。
2、创建一个空的win32 动态库项目,将Sqlite的源代码文件加进来,进行编译,没有报错,但是查看编译目录,发现只是生成了dll文件却没有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
fatal error LNK1120: 8 个无法解析的外部命令
解决办法,项目属性--配置属性--C/C++-- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_COLUMN_METADATA,
再次重新编译,还是报错,sqlite3.def: error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback,同样是缺少一个宏定义,
项目属性--配置属性--C/C++-- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_RTREE,
最后编译没有问题,在目录下生成了lib以及dll。
到此,对于一般的学习没啥问题,但是有时候我们需要将头文件、lib以及dll发布为一个开发包,这样我们可以设置工程属性,也可以使用生成后事件,将相应的文件拷贝到我们想发布的目录下,其实也还可以写Makefile文件,不好意思,目前还不会写。
VS的生成后事件为:右键点击工程属性-编译事件-生成后事件-命令行中写cmd的copy命令就好了,这样防止我们每次都手动拷贝文件带来的麻烦。
将dll拷贝到我自己要发布的bin目录下。
copy $(TargetPath)$(SolutionDir)thirdPartLib\Sqlite3.8\bin\
拷贝lib文件
copy $(TargetDir)$(TargetName).lib$(SolutionDir)thirdPartLib\Sqlite3.8\lib\
拷贝所有的头文件
copy $(InputDir)*.h$(SolutionDir)thirdPartLib\Sqlite3.8\include\
OK了,写个测试程序测试下。
#include <stdio.h>
#include "sqlite3.h"
sqlite3* db;
void Insert();
void Query();
void Delete();
void main()
{
if(sqlite3_open("E:\\work\\beijing.db",&db) != SQLITE_OK)
{
return;
}
constchar* pszSql = "CREATE TABLE POINT(ID INTEGER PRIMARY KEY,名称TEXT,地址TEXT)";
sqlite3_exec(db,pszSql,NULL,NULL,NULL);
Insert();
Query();
Delete();
}
void Insert()
{
constchar* pszInsert = "INSERT INTO POINT VALUES(null,‘高德大厦‘,‘海淀区花园北路‘)";
sqlite3_exec(db,pszInsert,NULL,NULL,NULL);
}
void Query()
{
sqlite3_stmt*stmt = NULL;
constchar* pszQuery = "SELECT * FROM POINT WHERE 名称LIKE ‘%大厦‘";
sqlite3_prepare(db,pszQuery,-1,&stmt,NULL);
while(sqlite3_step(stmt) == SQLITE_ROW)
{
intid = sqlite3_column_int(stmt,0);
printf("ID为:%d\n",id);
constunsigned char* pszAddr = sqlite3_column_text(stmt,2);
printf("%s\n",pszAddr);
}
sqlite3_finalize(stmt);
}
void Delete()
{
constchar* pszDel = "DELETE FROM POINT WHERE 名称LIKE ‘%大厦‘";
sqlite3_exec(db,pszDel,NULL,NULL,NULL);
}
spatialite是Sqlite在空间数据上的一个扩展,类似于POSTGIS以及Oracle spatial等数据库的扩展,以后有时间再研究。