csqlite是非常好用的数据库,同时该数据库是开源的,基于一定原因可能需要编译自己需要的csqlite版本,那么下面介绍内容也会你就会感兴趣了。
这里要实现的目标是使用VS工具能够正确编译csqlite源码文件生成csqlite的动态库文件。
准备:
csqlite源码文件:
sqlite-amalgamation-3080803.zip
sqlite-dll-win32-x86-3080803.zip
*注:这里我在官方网站下载了2个压缩包,为什么呢以为里面的5个文件都需要使用(shell.c/sqlite3.c/sqlite3.h/sqlite3ext.h/sqlite3.def)。
编译工具:
VS2013 UPDATE 4
环境配置:
1.启动VS2013创建win32的空的dll工程
2.添加现有项:shell.c/sqlite3.c/sqlite3.h/sqlite3ext.h/sqlite3.def
3.设置项目属性:
1)生成动态库dll(这是默认的),字符集选择多字节的
2)C/C++选项: 预处理定义:SQLITE_ENABLE_COLUMN_METADATA/SQLITE_ENABLE_RTREE(为什么呢?后面将)
3)连接器选项:输入:模块定义文件:sqlite3.def
*注:SQLITE_ENABLE_COLUMN_METADATA 对应def文件中导出的函数
sqlite3_column_database_name
sqlite3_column_database_name16
sqlite3_column_origin_name
sqlite3_column_origin_name16
sqlite3_column_table_name
sqlite3_column_table_name16
SQLITE_ENABLE_RTREE对应def文件导出的函数
sqlite3_rtree_geometry_callback
sqlite3_rtree_query_callback
如果不设置这两个宏的话不会直接编译通过,会提示类似:“1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback”
编译:如果以上设置无误的话直接编译就会通过,并且生成lib文件和dll文件
==========================================================
在介绍一种快速生成lib文件的方法(适用于存在def文件的情况)
官方下载:sqlite-dll-win32-x86-3080803.zip
这个压缩包里面只有def文件和dll文件,要想正常使用怎么办呢?
答:使用VS2013自带的命令提示行工具,输入命令:LIB /DEF:def文件路径,这样就会生成默认的lib文件
=======================================================================
破坏式编译csqlite源文件
具体就是在sqlite3.h和sqlite3.cpp中前面插入一段导出代码
例如:
1 #pragma once 2 3 #ifdef CSQLITE_DLL_FINAL2_EXPORTS 4 #define SQLITE_API __declspec(dllexport) 5 #else 6 #define SQLITE_API __declspec(dllimport) 7 #endif // !CSQLITE_DLL_FINAL2_EXPORTS
这样就可以达到导出csqlite库的目的。但是这种方法会破坏原始的csqlite文件所以不推荐。
具体可操作的方法是在创建csqlite库工程时,除了添加sqlite3.h和sqlite3.cpp,还要创建添加一个头文件,头文件里面放上面代码,这样,在sqlite3.h和sqlite3.cpp前面进行头文件引用就可以正常导出了。