首页 > 代码库 > 在VS2008下编译出sqlite3.dll和sqlite3.lib

在VS2008下编译出sqlite3.dll和sqlite3.lib

废话就不多说了,直接进入主题。

    1、进入http://sqlite.org/download.html下载sqlite-amalgamation-3071300.zip和sqlite-dll-win32-x86-3071300.zip,解压;

    2、创建一个空的win32 dll项目,将解压缩的文件添加进来,进行编译,没有报错,但是查看编译目录,发现只是生成了sqlite3.dll而不见sqlite3.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
        D:\HHTDEV\C++\Sqlite\Debug\sqlite3.lib : fatal error LNK1120: 8 个无法解析的外部命令

        解决办法,项目属性--配置属性--C/C++ -- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_COLUMN_METADATA,

        再次编译时,还是报错,sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_rtree_geometry_callback,同样是缺少一个宏定义,

        项目属性--配置属性--C/C++ -- 预处理器 -- 预处理器定义--预处理器定义,添加SQLITE_ENABLE_RTREE,

        再次编译,没有问题。

        另一个解决办法是,在sqlite3.c文件添加如下宏定义,

        //add two micro
        #define SQLITE_ENABLE_RTREE  
        #define SQLITE_ENABLE_COLUMN_METADATA 

        以上两个方法是等效的。看个人习惯了。

4、提供另外一种方法来生成lib文件:

想将sqlite3加入到我的项目中来,但是根据源代码生成sqlite3.dll和sqlite3.lib太麻烦!幸好VC下提供Lib工具,可以根据dll和def文件生成lib文件。具体过程如下:

1)进入VC2008所带的DOS环境下。

2)通过cd命令进入sqlite3.dll和sqlite3.def所在的文件夹。

3)通过下面的命令生成sqlite3.lib。

LIB /MACHINE:IX86 /DEF:sqlite3.def

通过以上步骤即可生成sqlite3.lib文件了!


5、接下来是验证我们生成的动态库是否可用了,

       sqlite官网提供了一个例子,我稍作修改如下:

     

[cpp] view plaincopy
  1. #include "stdafx.h"  
  2. #include <stdio.h>    
  3. #include "sqlite3.h"    
  4. #include <process.h>  
  5. #pragma comment(lib,"sqlite3.lib")    
  6.   
  7. static int callback(void *NotUsed, int argc, char **argv, char **azColName){  
  8.     int i;  
  9.     for(i=0; i<argc; i++){  
  10.         printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  
  11.     }  
  12.     printf("\n");  
  13.     return 0;  
  14. }  
  15.   
  16. int _tmain(int argc, char* argv[])  
  17. {  
  18.     sqlite3 *db;  
  19.     char *zErrMsg = 0;  
  20.     int rc;  
  21.   
  22.     if( argc!=2 ){  
  23.         fprintf(stderr, "Usage: %s DATABASE\n", argv[0]);  
  24.         system("pause");  
  25.         return(1);  
  26.     }  
  27.     rc = sqlite3_open(argv[1], &db);  
  28.     if( rc ){  
  29.         fprintf(stderr, "Can‘t open database: %s\n", sqlite3_errmsg(db));  
  30.         sqlite3_close(db);  
  31.         return(1);  
  32.     }  
  33.   
  34.     //char* sqlstatement = "create table test(int id,varchar name);";  
  35.     //char* sqlstatement = "insert into test values(1,‘hello‘);";  
  36.     char* sqlstatement = "select * from test;";  
  37.     rc = sqlite3_exec(db, sqlstatement, callback, 0, &zErrMsg);  
  38.     if( rc!=SQLITE_OK ){  
  39.         printf("%s\n",argv[2]);  
  40.         fprintf(stderr, "SQL error: %s\n", zErrMsg);  
  41.         sqlite3_free(zErrMsg);  
  42.     }  
  43.     sqlite3_close(db);  
  44.   
  45.     system("pause");  
  46.     return 0;  
  47. }  

测试结果,OK。