Linux下用C-C++数据库sqlite3开发笔记
- 格式:doc
- 大小:67.50 KB
- 文档页数:14
sqlite数据库c语言-回复如何在C语言中使用SQLite数据库SQLite是一款轻量级的嵌入式关系数据库引擎,通过在C语言中使用SQLite可以在应用程序中存储和管理数据。
本文将一步一步地介绍如何在C语言中使用SQLite数据库。
第一步:安装SQLite在开始之前,我们需要先安装SQLite数据库。
SQLite是一个开源的数据库引擎,可以在官方网站上免费下载最新版本。
安装过程比较简单,只需按照提示一步步完成即可。
第二步:导入SQLite库文件在C语言中使用SQLite数据库,首先需要导入SQLite库文件。
SQLite 库文件可以从安装目录中找到,一般命名为libsqlite3.a或者libsqlite3.so,取决于你所在的操作系统。
在你的C语言项目中,添加以下代码段以导入SQLite库文件:cinclude <sqlite3.h>这将使你的项目能够使用SQLite库中的函数和数据类型。
第三步:打开和关闭数据库在C语言中使用SQLite数据库,首先需要打开一个数据库。
可以使用sqlite3_open函数来打开一个数据库。
该函数接受两个参数,第一个参数是数据库的文件路径,第二个参数是用来存储数据库对象的指针。
下面的代码段演示了如何打开一个SQLite数据库:csqlite3 *db;int result = sqlite3_open("mydatabase.db", &db);if (result != SQLITE_OK) {printf("无法打开数据库:s\n", sqlite3_errmsg(db));sqlite3_close(db);return result;}这段代码通过调用sqlite3_open函数打开了一个名为mydatabase.db的数据库。
如果打开成功,返回值为SQLITE_OK(常量值为0),否则返回一个错误代码。
数据库使用前提是:在你的操作系统等环境你已安装好数据库(这部分知识在这里不作进一步讲解)!首先说说数据库的作用吧:就是存储数据、提取数据、以及删除数据等等。
ok,下面我们来说说如何使用数据库吧!使用数据库就在于如何使用API接口函数,就是数据库调用者的交互方法,至于数据库后面的架构由数据库自己处理。
部分接口函数:int sqlite3_open(const char*, sqlite3**); //打开数据库函数int sqlite3_open16(const void*, sqlite3**);int sqlite3_close(sqlite3*); //关闭数据库函数const char *sqlite3_errmsg(sqlite3*); //显示错误函数const void *sqlite3_errmsg16(sqlite3*);int sqlite3_errcode(sqlite3*); //显示错误代码函数typedef int (*sqlite_callback)(void*,int,char**, char**); //回调函数定义int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**); //执行函数typedefstruct sqlite3_stmt sqlite3_stmt; //字节码定义int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);//准备函数int sqlite3_finalize(sqlite3_stmt*); //定案函数int sqlite3_reset(sqlite3_stmt*); //重置函数使用API接口函数有两种方法:封装查询和预编译查询。
下面正式开始使用数据库:第一步:利用封装查询或者预编译查询方法编写数据库操作程序,这里我们利用封装查询的方法编写程序,程序名:sqlite_test.c,代码如下:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #include <stdio.h>#include "sqlite3.h"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 DAT ABASE SQL-ST ATEMENT\n", argv[0]);exit(1);}rc = sqlite3_open(argv[1], &db);//数据库打开函数if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);exit(1);}rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);//数据库执行函数if( rc!=SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}sqlite3_close(db);//数据库关闭函数return 0;}--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------第二步:运行操作数据库的执行程序以及创建数据库和创建表:sqlite_test test.db creat table具体操作:t (name yarchar(10),number smallint);”第三步:添加表的数据:sqlite_test test.db “insert into”具体操作:t values(…test‟,1);”第四步:获取表的数据:sqlite_test test.db “select”具体操作:from t;”以上操作均在安装好数据库的环境下操作…ok,搞定!!!。
sqlite数据库 c语言SQLite 是一个 C 语言库,用于轻量级的磁盘文件数据库。
它的特点是数据库文件是单个磁盘文件,可以通过常规的读写文件系统来访问。
SQLite 提供了 SQL 语言接口,可以执行 SQL 查询和更新。
以下是一个简单的 C 语言示例,使用 SQLite 进行数据库操作:```cinclude <>include <>int main() {sqlite3 db;char err_msg = 0;int rc;char sql;rc = sqlite3_open("", &db);if (rc) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db)); return(0);} else {fprintf(stderr, "成功打开数据库\n");}// 创建表格sql = "CREATE TABLE Friends (Id INT, Name TEXT);"rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL错误: %s\n", err_msg);sqlite3_free(err_msg);} else {fprintf(stdout, "表格创建成功\n");}// 插入数据sql = "INSERT INTO Friends (Id, Name) VALUES (1, 'Tom');" rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL错误: %s\n", err_msg);sqlite3_free(err_msg);} else {fprintf(stdout, "数据插入成功\n");}// 查询数据sql = "SELECT FROM Friends;"rc = sqlite3_exec(db, sql, callback, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL错误: %s\n", err_msg);sqlite3_free(err_msg);} else {fprintf(stdout, "查询成功\n");}sqlite3_close(db);return 0;}```这个示例首先打开一个名为 "" 的数据库,然后创建一个名为 "Friends" 的表格,插入一行数据,然后查询所有的数据。
sqlite3.connect参数
sqlite3.connect的参数是一个字符串,用于指定要连接的数据
库文件的路径。
常见的参数有:
1. 文件路径:可以是绝对路径或相对路径,用于指定数据库文件的位置。
例如:"database.db"表示当前目录下的database.db
文件。
2. 特殊标识符:有些特殊的标识符可以用于表示特殊的数据库。
例如,":memory:"表示一个临时内存数据库,不会写入磁盘。
3. 参数列表:可以使用一些参数来控制数据库连接的行为,参数以问号 "?" 开头。
例如:"?timeout=10"表示连接超时时间为10秒。
示例:
```
import sqlite3
# 连接到位于当前目录下的database.db文件
conn = sqlite3.connect("database.db")
# 连接到临时内存数据库
conn = sqlite3.connect(":memory:")
# 连接到位于其他目录的数据库文件
conn = sqlite3.connect("/path/to/database.db")
# 使用参数设置连接超时时间为10秒
conn = sqlite3.connect("database.db?timeout=10") ```。
CC++语⾔操作sqlite数据库(增删改查)在某项⽬中,需要在前端相机中做⼈脸⽐对,因此需要在前端相机中增加⼀个⼈脸底库,⼈脸底库由uuid和⼈脸特征值组成。
其中特征值为512个float 数据,移植sqlite⽤来保存底库信息,⾸先写了⼀个demo,验证可⾏性之后应⽤到实际项⽬中sqlite3 * db= NULL;int rc = 0;char * sql = new char[800];//这个要适当的申请⼤⼀点,要不然不够⽤。
char * zErrMsg = NULL;string id1 = "aaa";//⽤来模拟32位的uuid.std::vector<float> feature1{0.12, 0.23, 0.34, 0.45, 0.56, 0.67};//⽤来模拟512个⼈脸特征值.string id2 = "bbb";//⽤来模拟32位的uuid.std::vector<float> feature2{1.12, 1.23, 1.34, 1.45, 1.56, 1.67};//⽤来模拟512个⼈脸特征值.string id3 = "ccc";//⽤来模拟32位的uuid.std::vector<float> feature3{2.12, 2.23, 2.34, 2.45, 2.56, 2.67};//⽤来模拟512个⼈脸特征值.string id4 = "ddd";//⽤来模拟32位的uuid.std::vector<float> feature4{3.12, 3.23, 3.34, 3.45, 3.56, 3.67};//⽤来模拟512个⼈脸特征值.//先把⼈脸特征值的float数组转成json,然后保存到数据库中。
cjson的源码和例程在你⾃⼰的github上保存了cJSON *root1, *js_feature1;root1 = cJSON_CreateObject();cJSON_AddItemToObject(root1, "face_feature1", js_feature1 = cJSON_CreateArray());for(int i = 0; i < feature1.size(); i++){cJSON_AddItemToArray(js_feature1, cJSON_CreateNumber(feature1.at(i)));}char *s1 = cJSON_PrintUnformatted(root1);printf("s1:%s\n", s1);//先把⼈脸特征值的float数组转成json,然后保存到数据库中。
c++ sqlite3实例一、简介SQLite3是一个轻量级的关系型数据库管理系统,它提供了SQL语言的支持,适用于嵌入式系统和小型应用。
在C语言中,我们可以使用SQLite3提供的一组API函数来与SQLite3数据库进行交互,实现数据的存储、查询和操作。
二、SQLite3 API函数SQLite3提供了一组API函数,用于与数据库进行交互。
以下是一些常用的SQLite3 API函数:1. sqlite3_open():打开数据库文件并返回一个sqlite3对象指针。
2. sqlite3_exec():执行SQL语句并处理结果。
3. sqlite3_close():关闭数据库连接。
4. sqlite3_column_text():获取查询结果中的文本数据。
5. sqlite3_bind_int():绑定参数到SQL语句中。
以下是一个简单的C语言SQLite3实例,用于创建数据库表、插入数据、查询数据和关闭数据库连接。
```c#include <stdio.h>#include <sqlite3.h>int main() {sqlite3 *db;char *err_msg = 0;int rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "Cannot open database: %s\n",sqlite3_errmsg(db));return 1;}// 创建表char *sql = "CREATE TABLE stocks " \"(id INTEGER PRIMARY KEY AUTOINCREMENT, " \" year INTEGER, month INTEGER, day INTEGER, " \" trans VARCHAR(255), num_commits INTEGER);";rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK ) {fprintf(stderr, "%s\n", err_msg);sqlite3_free(err_msg);}// 插入数据sql = "INSERT INTO stocks VALUES (1, 2001, 1, 1, 'BUY', 5);" \ "INSERT INTO stocks VALUES (2, 2002, 5, 5, 'SELL', 10);" \ "INSERT INTO stocks VALUES (3, 2004, 7, 28, 'BUY', 2);" \ "INSERT INTO stocks VALUES (4, 2005, 9, 9, 'SELL', 7);"; rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK ) {fprintf(stderr, "%s\n", err_msg);sqlite3_free(err_msg);} else {printf("1 row inserted.\n");}// 关闭数据库连接sqlite3_close(db);return 0;}```四、注意事项在使用SQLite3时,需要注意以下几点:1. 在使用sqlite3_open()打开数据库时,需要指定正确的数据库文件路径。
S QL ITE3 基础教程sqlite 常量的定义:constSQLITE_OK SQLITE_ERROR = 0; 返回成功= 1; SQL 错误或错误的数据库SQLITE_INTERNAL = 2; An internal logic error in SQLiteSQLITE_PERM SQLITE_ABORT SQLITE_BUSY SQLITE_LOCKED SQLITE_NOMEM = 3; 拒绝访问= 4; 回调函数请求中断= 5; 数据库文件被锁= 6; 数据库中的一个表被锁= 7; 内存分配失败SQLITE_READONLY = 8; 试图对一个只读数据库进行写操作SQLITE_INTERRUPT = 9; 由sqlite_interrupt()结束操作SQLITE_IOERR = 10; 磁盘I/O 发生错误SQLITE_CORRUPT = 11; 数据库磁盘镜像畸形SQLITE_NOTFOUND = 12; (Internal Only)表或记录不存在SQLITE_FULL = 13; 数据库满插入失败SQLITE_CANTOPEN = 14; 不能打开数据库文件SQLITE_PROTOCOL = 15; 数据库锁定协议错误SQLITE_EMPTY SQLITE_SCHEMA SQLITE_TOOBIG = 16; (Internal Only)数据库表为空= 17; 数据库模式改变= 18; 对一个表数据行过多SQLITE_CONSTRAINT = 19; 由于约束冲突而中止SQLITE_MISMATCH = 20; 数据类型不匹配SQLITE_MISUSE = 21; 数据库错误使用SQLITE_NOLFS SQLITE_AUTH = 22; 使用主机操作系统不支持的特性= 23; 非法授权SQLITE_FORMAT = 24; 辅助数据库格式错误SQLITE_RANGE SQLITE_NOTADB SQLITE_ROW SQLITE_DONE前序= 25; 2nd parameter to sqlite_bind out of range = 26; 打开的不是一个数据库文件= 100; sqlite_step() has another row ready= 101; sqlite_step() has finished executingSqlite3 的确很好用。
SQLite3命令⾏操作指南.help查看帮助信息.backup ?DB? FILE备份数据库, ⽅法:.backup [main|...] filename, 数据库名可以通过.databases 命令得到,⼀般为main, 可以省略, filename为磁盘⽂件名..bail ON|OFF遇到错误时不再继续, 默认为OFF.databases列出附加到数据库的数据库和⽂件.dump ?TABLE? ...保存表到SQL格式的⽂件中, 没有指定表名, 则保存所有. 如果要保存到磁盘上需要结合 .output 命令..echo ON|OFF打开/关闭命令⾏回显.exit退出该命令⾏.explain ?ON|OFF?以合适的⽅式显⽰表头, 不带参数则为开启.header<s> ON;OFF是否显⽰表头, 和 .explain 差别不是很⼤.help显⽰帮助信息.import FILE TABLE从⽂件中导⼊表.indices ?TABLE?显⽰索引.load FILE ?ENTRY?加载⼀个扩展库.log FILE|off是否记录⽇志,⽂件可以是标准输出/输⼊.mode MODE ?TABLE?设置输出模式, 模式可以是以下⼏种:csv 以逗号分隔的值column 表头左对齐(参见 .width)html 显⽰ HTML 代码insert SQL插⼊语句line ⼀⾏⼀个值list 值⽤ string 分隔tabs 以 tab 分隔的值tcl TCL 列表元素.nullvalue STRING以 STRING 代替 NULL 值的输出.output FILENAME输出到⽂件, ⽽不是显⽰在屏幕上.output stdout输出到屏幕上.prompt MAIN CONTINUE替换默认的命令提⽰信息, 默认就是 sqlite> .quit退出命令⾏.read FILENAME执⾏ FILENAME 中的 SQL.restore ?DB? FILE从⽂件中还原数据到表, 默认表为 main.schema ?TABLE?显⽰ CREATE 语句.timeout MS在 MS 时间内尝试打开被锁定的表.vfsname ?AUX?显⽰ VFS 栈信息.width NUM1 NUM2 ...设置 column 模式中的列的宽度.timer ON|OFF显⽰CPU时间其它:参见 SQLITE3 官⽅命令⼿册⽐如 cacuum 可以释放磁盘空间...再其它:执⾏该 SQL 语句--End of File--。
S lide命令行功能简介DML/DDL语句的使用和以前一致,不做介绍.databases 列出数据库文件名.tables ?PATTERN? 列出?PATTERN?匹配的表名.import FILE TABLE 将文件中的数据导入的文件中.dump ?TABLE? 生成形成数据库表的SQL脚本.output FILENAME 将输出导入到指定的文件中.output stdout 将输出打印到屏幕.mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl….nullvalue STRING 用指定的串代替输出的NULL串.read FILENAME 执行指定文件中的SQL语句.schema ?TABLE? 打印创建数据库表的SQL语句.separator STRING 用指定的字符串代替字段分隔符.show 打印所有SQLite环境变量的设置.quit (或.exit) 退出命令行接口sqlite官方提供的shell命令行程序sqlite3.exe如何使用及操作数据库详解1、创建数据库打开命令行窗口,确保当前路径能够执行sqlite3.exe。
不明白的童鞋可以网上搜一下windows 下环境变量path的设置。
sqite3 DBNAME.EXT执行上面的命令,其中DBNAME为你要命名的数据库名,EXT为扩展名,扩展名有没有都可以。
执行命令后,并不会立即生成文件。
2、最重要的命令.help进入sqlite命令模式下后,执行.help这个命令,就会显示出所有可用的操作。
任何时候忘记了命令,都可以去查查。
到此,先说明两点一、凡是.help中显示列表中的命令,均不需要分号结尾二、凡是sql语句,均需要加分号结尾表示该语句结束,然后回车执行好,继续介绍命令。
3、创建一个数据表create table tablename(fieldname fieldtype[,...]);和一般的sql语法差不多,只是写表结构的时候,字段名fieldname要写在字段类型fieldtype 前面,同时注意分号作为sql语句结尾。
sqlite入门基础:sqlite3_open,sqlite3_exec,slite3_close打开数据库链接sqlite3_open用法原型:用这个函数开始数据库操作。
需要传入两个参数,一是数据库文件名,比如:E:/test.db。
文件名不需要一定存在,如果此文件不存在,sqlite会自动建立它。
如果它存在,就尝试把它当数据库文件来打开。
二是sqlite3**,即前面提到的关键数据结构。
这个结构底层细节如何,你不要管它。
函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。
相关的返回值sqlite定义了一些宏。
具体这些宏的含义可以参考sqlite3.h 文件。
里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。
只要你会看英文,sqlite 可以让你学到不少东西)。
关闭数据库链接sqlite3_close用法原型:ppDb为刚才使用sqlite3_open打开的数据库链接执行sql操作sqlite3_exec用法原型:这就是执行一条sql 语句的函数。
第1个参数不再说了,是前面open函数得到的指针。
说了是关键数据结构。
第2个参数constchar*sql是一条sql 语句,以\0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数char** errmsg 是错误信息。
注意是指针的指针。
sqlite3里面有很多固定的错误信息。
执行sqlite3_exec 之后,执行失败时可以查阅这个指针(直接cout<<errmsg得到一串字符串信息,这串信息告诉你错在什么地方。
Linux下用C/C++数据库sqlite3 开发笔记 最近在Linux下用到数据库sqlite3,于是开始了该方面的学习。 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库、创建表格、插入数据、查询数据、删除数据等。
1. 说明 这里我们假设你已经编译好了sqlite的库文件 : libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig 和可执行文件 : sqlite3
我们再假设你的sqlite3的安装目录在 /usr/local/sqlite3 目录下。 如果不是,我们可以这样做,将你的安装文件复制到 /usr/local/sqlite3 这个目录, 这样我们好在下面的操作中更加统一,从而减少出错的概率
例如:[root@localhost home]# cp -rf sqlite-3.3.8-ix86/ /usr/local/sqlite3 这里假设 /home/sqlite-3.3.8-ix86/ 是你的安装目录,也就是说你的sqlite原来就是安装在这里
这样之后,我们的sqlite3的库文件目录是:/usr/local/sqlite3/lib 可执行文件 sqlite3 的目录是: /usr/local/sqlite3/bin 头文件 sqlite3.h 的目录是: /usr/local/sqlite3/include
好拉,现在开始我们的Linux下sqlite3编程之旅。 2. 开始 这里我们现在进行一个测试。 现在我们来写个C/C++程序,调用 sqlite 的 API 接口函数。
下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口. 数据库的名字由第一个参数取得且第二个参数或更多的参数是 SQL 执行语句. 这个函数调用sqlite3_open() 在 16 行打开数据库,并且sqlite3_close() 在 25 行关闭数据库连接。
[root@localhost temp]# vi opendbsqlite.c 按下 i 键切换到输入模式,输入下列代码:
// name: opendbsqlite.c // This prog is used to test C/C++ API for sqlite3.It is very simple,ha! // Author : zieckey All rights reserved. // data : 2006/11/13
#include #include int main( void ) { sqlite3 *db=NULL; char *zErrMsg = 0; int rc; //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 rc = sqlite3_open("zieckey.db", &db); if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
sqlite3_close(db); //关闭数据库 return 0; } 退出,保存。(代码输入完成后,按下 Esc 键,然后输入: :wq ,回车就好拉) 好拉,现在编译:[root@localhost temp]# gcc opendbsqlite.c -o db.out 或者遇到这样的问题: [root@localhost temp]# gcc opendbsqlite.c -o db.out opendbsqlite.c:11:21: sqlite3.h: 没有那个文件或目录 opendbsqlite.c: In function `main': opendbsqlite.c:19: `sqlite3' undeclared (first use in this function) opendbsqlite.c:19: (Each undeclared identifier is reported only once opendbsqlite.c:19: for each function it appears in.) opendbsqlite.c:19: `db' undeclared (first use in this function)
这是由于没有找到头文件的原因。 也许会碰到类似这样的问题: [root@localhost temp]# gcc opendbsqlite.c -o db.out
/tmp/ccTkItnN.o(.text+0x2b): In function `main': : undefined reference to `sqlite3_open' /tmp/ccTkItnN.o(.text+0x45): In function `main': : undefined reference to `sqlite3_errmsg' /tmp/ccTkItnN.o(.text+0x67): In function `main': : undefined reference to `sqlite3_close' /tmp/ccTkItnN.o(.text+0x8f): In function `main': : undefined reference to `sqlite3_close' collect2: ld returned 1 exit status 这是个没有找到库文件的问题。 下面我们着手解决这些问题。
由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译: [root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等, 去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。 如果我们在编译安装的时候,选择了安装路径,例如这样的话: ....... # ../sqlite/configure --prefix=/usr/local/sqlite3 # make
.......
这样编译安装时,sqlite的库文件将会生成在 /usr/local/sqlite3/lib 目录下 sqlite的头文件将会生成在 /usr/local/sqlite3/include 目录下
这时编译还要指定库文件路径,因为系统默认的路径没有包含 /usr/local/sqlite3/lib [root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib 如果还不行的话,可能还需要指定头文件 sqlite3.h 的路径,如下: [root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include
这样编译应该就可以了 ,运行: [root@localhost temp]# ./db.out ./db.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
运行是也许会出现类似上面的错误。 这个问题因为刚刚编译的时候没有选择静态编译,那么按照默认的编译就动态编译的。 动态编译后,由于可执行文件在运行时要调用系统库文件, 那么沿着系统默认的库文件搜索路径搜索,就可能找不到我们现在所需的库文件。 致使出现 "error while loading shared libraries" 等错误。 我们可以这样解决: 方法一:静态编译 在编译时加上 -static 参数,例如 [root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include -static [root@localhost temp]# ll 总用量 1584 -rwxr-xr-x 1 root root 1596988 11月 13 10:50 db.out -rw-r--r-- 1 root root 614 11月 13 10:31 opendbsqlite.c 可以看到输出文件 db.out ,其大小为: 1596988k 运行,好了,没有出现错误 [root@localhost temp]# ./db.out You have opened a sqlite3 database named zieckey.db successfully! Congratulations! Have fun ! ^-^
方法二:重新配置系统环境变量 LD_LIBRARY_PATH 这时需要指定 libsqlite3.so.0 库文件的路径,也就是配置系统环境变量 LD_LIBRARY_PATH , 使系统能够找到 libsqlite3.so.0 。
去掉 -static ,在编译: [root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include [root@localhost temp]# ll 总用量 36 -rwxr-xr-x 1 root root 12716 11月 13 10:56 db.out -rw-r--r-- 1 root root 614 11月 13 10:31 opendbsqlite.c [root@localhost temp]# 可以看到输出文件 db.out ,其大小为: 12716k,比刚才的静态编译要小得多。 所以我们推荐使用动态编译的方法。