链接到sqlite3.h与gcc的问题

App*_*Fzx 6 c sqlite linker gcc

我正在使用Linux Mint 15.我sqlite-amalgamation-3080002.ziphttp://www.sqlite.org/download.html下载了(并将文件放在我的项目目录中)

我已经完成了(尽管我知道它对上一步是多余的):

sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

跑了:

gcc ./sqliteTest.c -o sqliteTest -lsqlite
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

./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
Run Code Online (Sandbox Code Playgroud)

我试过了:

gcc -Wall sqliteTest.c -o sqliteTest -lsqlite
Run Code Online (Sandbox Code Playgroud)

得到了:

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
Run Code Online (Sandbox Code Playgroud)

我更改了<sqlite3.h>to "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
Run Code Online (Sandbox Code Playgroud)

我很难过......接下来我该怎么办?

Siy*_*Ren 8

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

gcc -O3 sqliteTest.c sqlite3.c -o sqliteTest -lpthread -ldl
Run Code Online (Sandbox Code Playgroud)

  • SQLite是生产者的源代码库.但是,OS供应商提供了预编译版本.名为"libsqlite3-dev"的软件包将`sqlite3.h`放入/ usr/include,并将`libqslite3.so`放入GCC将找到它的目录中.由于提问者在他的代码中执行了`#include <sqlite3.h>`,而不是`#include"sqlite3.h"`,他试图使用系统版本,而且他也下载了源代码的事实是一个可忽略的红色鲱鱼.或者,他应该按照你推荐的方式去做,但是他也应该`#include"sqlite3.h"`而不是`#include <sqlite3.h>`. (3认同)

Abh*_*yak 6

这有效

gcc ./sqliteTest.c -o sqliteTest -lsqlite3
Run Code Online (Sandbox Code Playgroud)


Thi*_*ame 5

好吧,首先,您应该在作用域中#include <stdlib.h>有一个适当的声明exit(),其次,您应该记住,您尝试链接的名称为“ sqlite3”,并用替换-lsqlite您的链接行中的-lsqlite3