深入理解SQLite3系列 (三)SQLite3入门
SQLite3入门 2、SQLite3的编译 静态库和共享库都是一个obj文件的集合,但静态链接后,执行程序中存在自己所需obj的一份拷贝,而动态链接后,执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件,在链接后其所有代码被加载,不管需要的还是不需要的。 似乎可以得出一个结论: 静态链接后的程序比动态链接的所用存储空间大,因为执行程序中包含了库中代码拷贝; 而动态链接的程序比静态链接的所用的运行空间大,因为它将不需要的代码也加载到运行空间。 1)Windows平台的编译 ? 静态库的编译 a) 下载SQLite3.6.20的源代码http://www.sqlite.org/sqlite-amalgamation-3_6_20.zip,解压sqlite-amalgamation-3_6_20.zip到sqlite-amalgamation-3_6_20目录。 b) 打开VS2005,新建一个VC++类型的项目,选择Win32控制台应用程序。 c) 输入项目名称为SQLite3620,确定。下一步。 d) 选择静态库,去掉”预编译头文件”的选项。确定。 e) 项目》添加现有项,选择刚才解压的sqlite-amalgamation-3_6_20目录中的三个源文件sqlite3.c、sqlite3.h和sqlite3ext.h。 f) 生成项目。OK,大工告成。 g) 去你的debug或者release目录去找你的lib去吧。 h) 简单吧,现在你已经有了一个SQLite3的关系数据库的lib。 ? 动态库编译 a) 下载SQLite3.6.20的源代码http://www.sqlite.org/sqlite-amalgamation-3_6_20.zip,解压sqlite-amalgamation-3_6_20.zip到sqlite-amalgamation-3_6_20目录。 b) 打开VS2005,新建一个VC++类型的项目,选择Win32控制台应用程序。 c) 输入项目名称为SQLite3620,确定。下一步。 d) 选择DLL,去掉”预编译头文件”的选项。确定。 e) 项目》添加现有项,选择刚才解压的sqlite-amalgamation-3_6_20目录中的三个源文件sqlite3.c、sqlite3.h和sqlite3ext.h。 f) 生成项目。OK,大工告成。 g) 去你的debug或者release目录去找你的dll去吧。 h) 简单吧,现在你已经有了一个SQLite3的关系数据库的dll。 其实Windows上的动态库和静态库的编译没有多大差别,so easy! 2)Linux平台的编译 a) 下载SQLite3.6.20的源代码http://www.sqlite.org/sqlite-amalgamation-3_6_20.zip。 b) 解压文件,[root]#tar –xzvf sqlite-amalgamation-3.6.20.tar.gz c) 进入解压目录,[root]#./configure d) [root]#make e) [root]#make install f) 到/usr/local/lib/即可以找到libsqlite3.a。 ? 动态库编译 细心的读者在编译lib的的时候应该已经注意到我们刚才在编译lib的时候已经借助autoconf/automake工具生成了so文件。同样在/usr/local/lib/下可以发现libsqlite3.so。关于autoconfi/automake的详细信息可以参考这里http://blog.csdn.net/absurd/archive/2009/04/02/4042463.aspx。如果不借助与autoconf和automake这样的工程管理工具,Linux系统静态库和动态库的编译可以参考如下方法: 静态库的编译,实际上是一个将.o文件打包的过程。 gcc –c sqlite3.c –o sqlite3.o ar -rc sqlite3.a sqlite3.o # 将sqlite3.o编译成静态库sqlite3.a 动态库的编译,使用gcc -fPIC -shared编译选项。 gcc -fPIC -shared -o sqlite3.so sqlite3.o # 将sqlite3.o编译成动态库sqlite3.so。 3)SQLite3的应用实例 ? 应用静态库 a) VS2005中新建一个win32控制台空项目,跟编译是一样去掉“预编译头文件”,主要是为了不引入windows的头文件。 b) 在工程的配置管理》连接器》输入您生成的lib。 c) 增加test.c,内容如下: #include <stdio.h> #include <stdlib.h> #include "sqlite3.h" int main( void ) { sqlite3 *db=NULL; char *zErrMsg = 0; int rc; //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 rc = sqlite3_open("zsl.db",&db);
{ fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db)); sqlite3_close(db); return (1); } else printf("You have opened a sqlite3 database named zsl.db successfully!/n"); //创建一个表,如果该表存在,则不创建, //并给出提示信息,存储在 zErrMsg 中 char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);" ; sqlite3_exec( db,sql,&zErrMsg ); //插入数据 sql = "INSERT INTO /"test/" VALUES(NULL,1,'200605011206',18.9 );" ; sqlite3_exec( db,&zErrMsg ); int nrow = 0,ncolumn = 0; //查询结果集的行数、列数 char **azResult; //二维数组存放结果 //查询数据 sql = "SELECT * FROM test "; sqlite3_get_table( db,&azResult,&nrow,&ncolumn,&zErrMsg ); int i = 0 ; printf( "row:%d column=%d /n",nrow,ncolumn ); printf( "/nThe result of querying is : /n" ); for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) printf( "azResult[%d] = %s/n",i,azResult[i] ); //删除数据 sql = "DELETE FROM test WHERE AGE = 1 ;" ; sqlite3_exec( db,&zErrMsg ); //释放掉 azResult 的内存空间 sqlite3_free_table( azResult ); sqlite3_close(db); //关闭数据库 int c=getchar(); return 0; } ? 应用动态库 对于so的使用,编写如下test.c文件,由于我们前边在编译so的时候已经把so放到了/usr/local/lib/目录。这个从autoconf/automake的提示信息可以看到。所以我们就可以编译test.c [root]#gcc –o test test.c libsqlite3.so –ldl [root]#./test 这是你应该已经看到和Windows下使用lib相同的执行结果了。 #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> #include "sqlite3.h" int main( void ) { sqlite3 *db=NULL; char *zErrMsg = 0; int rc;
/*获得函数的入口*/ int (*sqlite3_open)(const char*,sqlite3**); int (*sqlite3_close)(sqlite3*); int (*sqlite3_exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); int (*sqlite3_get_table)(sqlite3*,char***,int*,char**); void (*sqlite3_free_table)(char**result);
/*加载库*/ void *handle = dlopen("libsqlite3.so",RTLD_LAZY);
sqlite3_open = dlsym(handle,"sqlite3_open"); sqlite3_close = dlsym(handle,"sqlite3_close"); sqlite3_exec = dlsym(handle,"sqlite3_exec"); sqlite3_get_table = dlsym(handle,"sqlite3_get_table"); sqlite3_free_table = dlsym(handle,"sqlite3_free_table"); //打开指定的数据库文件,如果不存在将创建 //一个同名的数据库文件 rc = sqlite3_open("zsl.db",&db);
if( rc ) { fprintf(stderr,"Can't open database./n"); sqlite3_close(db); return (1); } else printf("You have opened a sqlite3 database named zsl.db successfully!/n"); //创建一个表,如果该表存在,则不创建, //并给出提示信息,存储在 zErrMsg 中 char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,SALARY REAL);" ; sqlite3_exec( db,&zErrMsg ); //插入数据 sql = "INSERT INTO /"test/" VALUES(NULL,18.9 );" ; sqlite3_exec( db,&zErrMsg ); int nrow = 0,ncolumn = 0; //查询结果集的行数、列数 char **azResult; //二维数组存放结果 //查询数据 sql = "SELECT * FROM test "; sqlite3_get_table( db,&zErrMsg ); int i = 0 ; printf( "row:%d column=%d /n",ncolumn ); printf( "/nThe result of querying is : /n" ); for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) printf( "azResult[%d] = %s/n",azResult[i] ); //删除数据 sql = "DELETE FROM test WHERE AGE = 1 ;" ; sqlite3_exec( db,&zErrMsg ); //释放掉 azResult 的内存空间 sqlite3_free_table( azResult ); sqlite3_close(db); //关闭数据库
/*卸载库*/ dlclose(handle); int c=getchar(); return 0; } ? SQLite3命令行 在Linux系统上当我们执行完了make install以后其实我们已经有一个Sqlite3的命令行可以使用了。只是我们主要关心SQLite3的实现,这里只简单的列出命令行可以使用的命令,至于详细信息请参考帮助。 line 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Shatty/archive/2009/12/01/4917487.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |