VS2008环境下编译Sqlite源代码

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等数据库的扩展,以后有时间再研究。

 

VS2008环境下编译Sqlite源代码,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。