您的位置:首页 > 数据库

ubuntu编译安装sqlite库

2016-03-01 22:59 274 查看

编译安装sqlite库

1、环境

ubuntu14.04 x64

2、sqlite数据库的优势

sqlite属于轻量级的数据库,特别适用于嵌入式设备,部署方便操作简单。

3、sqlite代码获取

https://www.sqlite.org/2016/sqlite-autoconf-3110000.tar.gz

4、代码编译

mkdir sqlite

tar zxvf sqlite-autoconf-3110000.tar.gz -C sqlite

cd sqlite/sqlite-autoconf-3110000

./configure –prefix=/home/andy/test #–prefix用于指定sqlite库文件、头文件和可行性命令的安装路径

- make #进行编译

- make install #把sqlite安装到–prefix指定的目录下

- 顺利执行后,在/home/andy/test 目录下会出现四个文件夹

- bin #存放sqlite命令文件

- include #存放sqlite的头文件

- lib #存放sqlite库文件,包括静态库和动态库

- share #存放帮助文件等辅助性的文档

5、移植

如果是相同的平台,可以把上述test目录下的四个文件夹拷贝到目标系统中,具体的做法为:

- 将bin目录下的文件拷贝到 /usr/local/bin

- 将lib目录下的文件拷贝到 /usr/local/lib 拷贝过程需要特别注意软连接

- include –> /usr/local/include

- share –> /usr/local/share

6、编译测试代码

下面代码就是在当前目录创建一个名为test.sq3的数据库文件

#include <stdio.h>

#include <sqlite3.h>

int main(int argc, char *argv[])

{

sqlite3 *handle = NULL;

int iret = 0;

iret = sqlite3_open("test.sq3", &handle);

if (iret != SQLITE_OK)

{

printf("sqlite3_open error, reason = %s\n", sqlite3_errmsg(handle));

return 0;

}

if(handle != NULL)

{

(void)sqlite3_close(handle);

}

return 0;

}


gcc -o test test.c -lsqlite3 #默认链接动态库

gcc -o test test.c -static -lsqlite3 -lpthread -ldl #指定链接动态库

7、链接静态库编译问题

刚开始直接使用gcc -o test test.c -static -lsqlite3 编译报如下错误:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:21116:对‘pthread_mutex_trylock’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘sqlite3ThreadCreate’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:24506:对‘pthread_create’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘pthreadMutexFree’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:21021:对‘pthread_mutex_destroy’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘pthreadMutexAlloc’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:20977:对‘pthread_mutexattr_init’未定义的引用

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:20978:对‘pthread_mutexattr_settype’未定义的引用

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:20979:对‘pthread_mutex_init’未定义的引用

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:20980:对‘pthread_mutexattr_destroy’未定义的引用

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:20988:对‘pthread_mutex_init’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘sqlite3ThreadJoin’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:24526:对‘pthread_join’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘unixDlError’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:33375:对‘dlerror’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘pthreadMutexLeave’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:21154:对‘pthread_mutex_unlock’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘pthreadMutexEnter’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:21070:对‘pthread_mutex_lock’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘unixDlClose’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:33406:对‘dlclose’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘unixDlSym’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:33402:对‘dlsym’未定义的引用

./lib//libsqlite3.a(sqlite3.o):在函数‘unixDlOpen’中:

说明sqlite库中还是通过动态加载的方式引用了pthread库和dl库。

改为gcc -o test test.c -static -lsqlite3 -lpthread -ldl 编译能成功,但是会有如下报警:

./lib//libsqlite3.a(sqlite3.o):在函数‘unixDlOpen’中:

/home/andy/code/sqlite/sqlite-autoconf-3110000/sqlite3.c:33361: 警告: Using ‘dlopen’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

提示编译环境和运行环境的libc版本必须一直。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: