在Visual Studio 下编译 sqlite3

来源:互联网 发布:js 内置对象 编辑:程序博客网 时间:2024/05/01 23:39

首先,sqlite 官方已经有预编译好的DLL下载,如果你不需要特别优化的版本,直接下载官网上的DLL即可。你可以在下载 页面的 “Precompiled Binaries For Windows” 可以找到。
不过你想编译出自己的版本,比如添加优化参数后编译,debug版,或进行一些定制(例如官网这里 有一些预编译宏,允许你定制自己的sqlite),那么你就需要自己编译了。

首先在下载源代码,在页面的第一行就是,如 sqlite-amalgamation-3_6_12.zip ,接着下载编译好的DLL,我们主要是需要这里面的一个 sqlite3.def 文件,因为源代码里没有。一般下拉到  “Precompiled Binaries For Windows”  就可以看到,例如 sqlitedll-3_6_12.zip 。有了这两个压缩包就可以了。

首 先解压 sqlite-amalgamation-3_6_12.zip 到文件夹 sqlite3/,会得到 sqlite3.c,sqlite3.h,sqlite3ext.h 三个文件,然后解压 sqlitedll-3_6_12.zip ,把sqlite3.def 移动到 sqlite3/ 下面。

打开 visual studio,新建一个空的dll工程,工程名为sqlite3,这样是为了能直接生成名为sqlite3.dll 的dll。然后sqlite3/  下的4个文件文件夹移动到此工程目录下,即与 sqlite3.vcproj 在同一级。
将 sqlite3.c 添加到工程,具体做法是右击“源文件”,选择“添加->现有项”,浏览到sqlite3.c即可。如下图所示。

undefined


然后将sqlite3.def 添加到工程,然后输入给连接器。具体做法是右击工程sqlite3,选择“属性”,在弹出的对话框中选择“连接器->输入”,在“模块定义文件”中输入sqlite3.def,如下图所示。

undefined

好,可以开始编译了,右击sqlite3,选择“生成”,结果链接出错,

—— 已启动生成: 项目: sqlite3, 配置: Release Win32 ——
正在编译…
sqlite3.c
正在链接…
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_table_column_metadata

看来sqlite3.def 中定义的这几个导出函数找不到定义,什么原因呢,经过一番google,找到这篇文章 ,需要增加一个预定义宏 SQLITE_ENABLE_COLUMN_METADATA,这个宏是什么意思呢,到官网 去查一下,

SQLITE_ENABLE_COLUMN_METADATA


When this C-preprocessor macro is defined, SQLite includes someadditional APIs that provide convenient access to meta-data abouttables and queries. The APIs that are enabled by this option are:

* sqlite3_column_database_name()
* sqlite3_column_database_name16()
* sqlite3_column_table_name()
* sqlite3_column_table_name16()
* sqlite3_column_origin_name()
* sqlite3_column_origin_name16()
* sqlite3_table_column_metadata()

原来是只有当启用了这个宏后,c代码中才会后这几个函数的定义,OK,在预处理器中添加 SQLITE_ENABLE_COLUMN_METADATA,如下图所示。

undefined

再来编译,搞定!

 

查看原文