Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gcc链接到sqlite3.h时出现问题_C_Gcc_Sqlite_Linker - Fatal编程技术网

使用gcc链接到sqlite3.h时出现问题

使用gcc链接到sqlite3.h时出现问题,c,gcc,sqlite,linker,C,Gcc,Sqlite,Linker,我在Linux Mint 15上工作。我已经从下载了sqlite-mergation-3080002.zip(并将文件放在我的项目目录中) 我已经做了(尽管我知道这是多余的前一步): sqlite3可以在命令行中正常工作,我可以创建/编辑数据库 我创建了一个测试文件: #include <stdio.h> #include <sqlite3.h> int main(int argc, char* argv[]){ sqlite3 *db; char *zE

我在Linux Mint 15上工作。我已经从下载了
sqlite-mergation-3080002.zip
(并将文件放在我的项目目录中)

我已经做了(尽管我知道这是多余的前一步):

sqlite3
可以在命令行中正常工作,我可以创建/编辑数据库

我创建了一个测试文件:

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

int main(int argc, char* argv[]){
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
}
并得到以下错误:

./sqliteTest.c: In function ‘main’:
./sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
/usr/bin/ld: cannot find -lsqlite
collect2: error: ld returned 1 exit status
我试过:

gcc -Wall sqliteTest.c -o sqliteTest -lsqlite
得到:

sqliteTest.c: In function ‘main’:
sqliteTest.c:14:7: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration]
sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
sqliteTest.c:7:10: warning: unused variable ‘zErrMsg’ [-Wunused-variable]
sqliteTest.c:19:1: warning: control reaches end of non-void function [-Wreturn-type]
/usr/bin/ld: cannot find -lsqlite
collect2: error: ld returned 1 exit status
我将
更改为
“sqlite3.h”
,并执行了第一个编译命令,得到:

./sqliteTest.c: In function ‘main’:
./sqliteTest.c:14:7: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
/tmp/ccvdOOv2.o: In function `main':
sqliteTest.c:(.text+0x24): undefined reference to `sqlite3_open'
sqliteTest.c:(.text+0x39): undefined reference to `sqlite3_errmsg'
sqliteTest.c:(.text+0x89): undefined reference to `sqlite3_close'
collect2: error: ld returned 1 exit status

我被难住了。。。下一步我该怎么做?

首先,您应该
#包括
以在范围中适当声明
exit()
,其次,您应该记住您尝试链接的对象名为“sqlite3”,并将链接行中的
-lsqlite
替换为
-lsqlite3

SQLite是一个源代码库。您将源代码嵌入到应用程序中,而不是与之链接。因此,未定义的引用来自您未能包含sqlite的源文件这一事实。尝试编译为

gcc -O3 sqliteTest.c sqlite3.c -o sqliteTest -lpthread -ldl
CodeLite: 右键单击项目>设置>链接器: 1.库搜索路径:/usr/include(sqlite3.h所在的路径); 2.库:sqlite3 3.按OK 和F7重建项目

此工程

gcc ./sqliteTest.c -o sqliteTest -lsqlite3

SQLite是生产者提供的仅源代码库。但是,操作系统供应商提供了预编译版本。名为“libsqlite3 dev”的包将
sqlite3.h
放入/usr/include,并将
libqslite3.so
放入GCC将在其中找到它的目录中。由于提问者确实在他的代码中包含了
,而不是
#包含了“sqlite3.h”
,他试图使用系统版本,而且他还下载了源代码这一事实是一个不可忽视的危险因素。或者,他应该按照你推荐的方式来做,但是他也应该在问题的最后一部分中加入“sqlite3.h”而不是“code>”而不是“include”
@ElchononEdelson:提问者试图改为“code>”,加入“sqlite3.h”
。但有趣的是,Mint提供了一个预编译版本。啊,我错过了。说得好。是的,只要他在做
“sqlite.h”
,他就应该在编译中添加sqlite3.c,而不是像你说的那样链接到
-lsqlite3
。而且,我认为几乎每个Linux都提供了这个库(以及其他很多库)的预编译。事实上,即使产品制造商提供构建,主要发行版也会倾向于提供自己的所有构建,因为这样他们就可以根据自己的操作系统布局和理念对其进行定制。(还有他们自己的错误修复等等…@ElchononEdelson实际上,我尝试的顺序是首先下载
sqlite-mergation-3080002.zip,因为这通常会提供更好的性能。这不起作用,并且用输入错误编译(
sqlite
vs
sqlite3
)也不起作用,命令提示符下的sqlite3也不起作用,所以我假设Mint实际上不随sqlite一起提供。所以我做了apt-get,这就是为什么我们睡觉时不编码。抢手货不过出于好奇:为什么当我通过
#include“sqlite3.h”
加入时,它不起作用?啊,真希望我能接受这两个答案。缺少
3
显然是一个愚蠢的错误。也很有用。
gcc -O3 sqliteTest.c sqlite3.c -o sqliteTest -lpthread -ldl
gcc ./sqliteTest.c -o sqliteTest -lsqlite3