SQLite3源码在Windows平台编译


SQLite3源码在Windows平台编译

工具:Mingw32
方法:命令行,尽量使用管理员模式

gcc -shared sqlite3.c -o sqlite3.dll

 注意MinGW只生成32位的dll。另有一个分开的MinGW64工程可以用来生成64位的dll。可以推断其命令行语法是类似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此为了最大限度的兼容你的生成的dll,推荐MinGW。一个好的经验法则是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。

在大部分情况下,你会想要去哦去提供编译时间相关的选项的基本的命令来调整你的程序。通常使用的编译时间相关的选项包括:

  • -Os - Optimize for size. Make the DLL as small as possible.

  • -O2 - Optimize for speed. This will make the DLL larger by unrolling loops and inlining functions.

  • -DSQLITE_ENABLE_FTS4 - Include the full-text search engine code in SQLite.

  • -DSQLITE_ENABLE_RTREE - Include the R-Tree extension.

  • -DSQLITE_ENABLE_COLUMN_METADATA - This enables some extra APIs that are required by some common systems, including Ruby-on-Rails.


工具:Visual Studio 2010

(1)把SQLite编译成动态链接库:
    打开Visual Studio 2010,新建一个名为sqlite3的Visual C++ Win32工程,在工程向导页中选择工程的类型为 "DLL", 并且把创建为空项目的复选框钩上。通过工程--->添加现有项...,把单一文件sqlite3.c添加到工程中。为了生成在链接sqlite3.dll时需要用到的lib文件,需要在工程中添加模块定义文件。根据sqlite3.h中列出的导出函数名,我们可以自己写.def文件,例如:
EXPORTS
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_auto_extension
sqlite3_backup_finish
sqlite3_backup_init
sqlite3_backup_pagecount
sqlite3_backup_remaining
sqlite3_backup_step
sqlite3_bind_blob
sqlite3_bind_double
;......
    也可以使用已写好的.def文件,下载已编译好的SQLite DLL库sqlite-dll-win32-x86-3071400.zip,里面有sqlite3.def,把它拷贝到我们的sqlite3项目中,在工程属性的Linker--->Input--->Module Definition File中输入sqlite3.def。设置项目编译成Release版本,编译后生成sqlite3.dll和sqlite3.lib。
    编译命令行管理工具:如果想编译出sqlite.exe命令行程序,则需要创建一个空的Win32 控制台程序,然后在往工程里添加文件sqlite3.c和shell.c,直接编译即可。

    使用动态链接库sqlite3.dll

    新建一个空项目test,把sqlite3.dll, sqlite3.lib, sqlite3.h拷贝到项目目录下,把sqlite3.h添加到项目中。新建主程序源文件test.cpp,如下:

复制代码
#include <stdio.h> #include "sqlite3.h" #pragma comment(lib,"sqlite3") /* print a record from table outputed by sql statement */ 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 main(int argc, char **argv){ sqlite3 *db; char *zErrMsg=0; int rc; if(argc!=3){ fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]); return(1); } rc=sqlite3_open(argv[1],&db); /* open database */ if(rc){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return(1); } rc=sqlite3_exec(db,argv[2],callback,0,&zErrMsg); /* execute SQL statement */ if(rc!=SQLITE_OK){ fprintf(stderr,"SQL error: %s\n",zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); /* close database */ return 0; }
复制代码

    编译后生成test.exe程序,它的运行依赖于sqlite3.dll。注意程序中也可以不使用pragma指令导入sqlite3.lib,而是在test项目属性中添加对上面的dll项目sqlit3的引用。
    这个C程序的例子显示怎么使用sqlite的C/C++接口。数据库的名字由第一个参数取得,第二个参数是一条或更多的SQL执行语句。这个程序调用sqlite3_open()打开指定的数据库,调用sqlite3_exec()对数据库执行SQL语句,callback函数会作用在SQL语句结果集的每条记录上。最后用sqlite3_close()关闭数据库连接。可以用前面的alf.db数据库来测试:test.exe alf.db "select * from mytable"。
    (2)把SQLite编译成静态链接库:
    新建一个名为sqlite3static,空的Visual C++ Win32工程,在工程向导页中选择工程的类型为 "Static library",去年"Precompiled header"复选框,导入源文件sqlite3.c,编译生成sqlite3static.lib,这是静态链接库版本,它要比动态链接库sqlite3.dll大的多。
    使用静态链接库:
    新建一个空项目sqlite3statictest,添加对项目sqlite3static的引用,同样使用上面的test.cpp,编译生成sqlite3statictest.exe。可以发现它是一个独立的可执行文件,不依赖静态链接库,删除静态链接库后仍然可以运行。
    实际上,静态链接库不存在导出的概念,在链接过程中,静态链接库LIB中的指令都全部被直接包含在最终生成的EXE文件中了,因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况。对于使用该静态库的EXE文件来说,直接使用LIB中的函数和全局变量即可,而不管它们有没有导出声明。另外一点在使用中需要注意的是:静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含。

工具:VC++6.0

 需要从SQLite官网下载源代码

  sqlite-amalgamation-*.zip

  sqlite-dll-win32-x86-*.zip

  sqlite-src-*.zip

  sqlite-preprocessed-*.zip

 1、  编译成Win32下的应用程序(*.exe),用于命令行模式下的调试

  (1)启动VC++6.0,创建一个Win32 Console Application空的工程,工程名为“SQlite”;

  (2)将sqlite-amalgamation-*.zip 解压后的shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h添加到工程中,直接编译即可生成sqlite.exe,可以在命令提示符下进行测试。

      

 编译时,出现以下错误:unresolved external symbol __beginthreadex
            unresolved external symbol __endthreadex

 这是在使用MFC的类时出现连接错误。

 解决方法:

 1.工程右键——>“Project”菜单——〉“Setting”菜单项——〉General选项卡,在Microsoft Fountion Classes:中选择:Use MFC in Static Library。
 2.再在C/C++选项卡中的在Category中选择Code Generation,再在Use run-time library中选择Debug Multithreaded(若在Win32 Debug环境下)或者multithreaded。

 其中:
  Single-Threaded单线程静态链接库(release版本)
  Multithreaded多线程静态链接库(release版本)
  multithreaded DLL多线程动态链接库(release版本)
  Debug Single-Threaded单线程静态链接库(debug版本)
  Debug Multithreaded多线程静态链接库(debug版本)
  Debug Multithreaded DLL多线程动态链接库(debug版本)

   2、编译生成Win32平台下的动态链接库(*.dll)。

    (1)启动VC++6.0,创建一个Win32 Dynamic_Link Library,选择一个空的DLL工程,工程名为“SQLite_Win32_DLL”;

  (2)将sqlite-amalgamation-*.zip解压后的sqlite3.c、sqlite3.h、sqlite3ext.h以及sqlite-dll-win32-x86-*.zip解压后的sqlite3.def模块定义文件一起添加到工程中;

         

 (3)【Project】->【Settings…】->【C/C++】->【Category】->【General】->【Preprocessor definitions】

    新增编译选项:SQLITE_ENABLE_COLUMN_METADATA,编译通过即可生成dll。

    

 但此时只生成了sqlite_win32_dll.dll文件,没有生成对应的引入库(sqlite_win32_dll.lib)文件。

 具体方法是如下:

 修改sqlite3.c文件中的SQLITE_API宏定义,将“# define SQLITE_API”修改成“# define SQLITE_API __declspec(dllexport)”。

 

 或者直接把sqlite3.def添加在Linker--->Input--->Module Definition File中。

 

 再重新编译即可生成sqlite_win32_dll.dll和sqlite_win32_dll.lib。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM