业精于勤,荒于嬉。

linux下GCC 编译sqlite 调用sqliteAPI编写程序

先看对数据库进行操作的代码

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

int showTableInfo ( void *para,int n_column,char **column_value,char **column_name );
int showCount ( void *para,int n_column,char **column_value,char **column_name );


int main ( int argc, char **argv ) {
    sqlite3 *db=NULL;
    char *errMsg;
    int rc;

    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
    rc = sqlite3_open ( "zieckey.db", &db );

    printf ( sqlite3_version );
    if ( rc ==SQLITE_OK ) {
        //如果打开成功
        printf ( "打开数据库成功!" );
        rc = sqlite3_exec ( db,"create table if not exists user(ID integer,name varchar(32))",NULL,NULL,&errMsg );

        if ( rc != SQLITE_OK ) {
            printf ( "创建表失败,错误码:%d,错误原因:%sn",rc,errMsg );
            printf ( "创建表user失败!" );

        }
        rc=sqlite3_exec ( db,"insert into user values('123','测试')",NULL,NULL,&errMsg );

        if ( rc != SQLITE_OK ) {
            printf ( "插入数据失败!" );
        }



        rc=sqlite3_exec ( db,"select * from user",showTableInfo,NULL,&errMsg );


        rc=sqlite3_exec ( db,"select count(*) from user",showCount,NULL,&errMsg );
        if ( rc != SQLITE_OK ) {
            printf ( "查询失败!" );
        }

    }
    return 0;
}


int showTableInfo ( void *para,int n_column,char **column_value,char **column_name ) {
    int i;
    printf ( "记录包含%d个字段\n",n_column );
    for ( i=0; i<n_column; i++ ) {
        printf ( "字段名:%s  >> 字段值:%s\n",column_name[i],column_value[i] );
    }
    printf ( "--------------------------------------\n" );
    return 0;
}

int showCount ( void *para,int n_column,char **column_value,char **column_name ) {
    printf ( "一共%s条记录%s\n",column_value[0],column_name[0] );
    return 0;
}

 

同时在你的目录下放置 sqlite的头文件(.h)和实现文件(.c)

使用命令

gcc sqlite3.c main.cpp -lpthread -ldl

执行后生成 a.out

运行./a.out 输出

open zieckey.db successfully!

并且目录下创建了一个zieckey.db

此时sqlite初体验结束


 

kdevelop4 如何添加编译参数来使用sqlite

如何用cmkae 编译libsqlite3.so

project(test10)

#添加需要编译的文件,制定编译方式为shared
add_library(sqlite3  SHARED shell.c sqlite3.c)
SHARED 如果不加这个SHARED参数,会制定为(编译)静态链接库
我们看下最后执行的链接命令
/usr/bin/gcc  -fPIC -g   -shared -Wl,-soname,libsqlite3.so -o libsqlite3.so CMakeFiles/sqlite3.dir/shell.c.o CMakeFiles/sqlite3.dir/sqlite3.c.o 

再看下静态链接库的链接命令


/usr/bin/ar cr libsqlite3.a  CMakeFiles/sqlite3.dir/shell.c.o CMakeFiles/sqlite3.dir/sqlite3.c.o
/usr/bin/ranlib libsqlite3.a

 


使用动态链接库

我吧链接库放在工程目录下。所以他做cmake钟的路径就可以写

${PROJECT_SOURCE_DIR}/libsqlite3.so

看完整cmake文件

project(test6)

#-- 源码目录:/home/leaves/projects/test6
#-- 编译目录:/home/leaves/projects/test6/build
MESSAGE(STATUS "源码目录:" ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "编译目录:" ${PROJECT_BINARY_DIR})

#设置变量,存放源代码列表
set(test6_SRC  main.c)

#添加可执行文件编译源代码
add_executable(test6 ${test6_SRC})

#添加动态链接库,${PROJECT_SOURCE_DIR}/libsqlite3.so是这个工程附带的链接库
target_link_libraries(test6 ${PROJECT_SOURCE_DIR}/libsqlite3.so  dl pthread )

如果想换成静态链接,只要给${PROJECT_SOURCE_DIR}/libsqlite3.so换成${PROJECT_SOURCE_DIR}/libsqlite3.a即可。

 

当然你一定要知道一件事,就所静态链接比动态链接编译的可执行程序要大【这里我的程序所1.2M和8K的区别(debug模式下)】。

 

待续。。。。

 

posted @ 2012-12-11 23:46  叶知泉  阅读(6001)  评论(0编辑  收藏  举报