使用gcc链接sqlite3.h文件时遇到的问题

8

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

我已经完成了以下步骤(尽管我知道这与之前的步骤重复):

sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev

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);
}

并运行:
gcc ./sqliteTest.c -o sqliteTest -lsqlite

并且遇到了以下错误:

./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>改为"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

我被难住了...下一步该尝试什么?

4个回答

11

这有效

gcc ./sqliteTest.c -o sqliteTest -lsqlite3

10

SQLite是一种仅提供源代码的库。你需要把源代码嵌入到应用程序中,而不是链接它。所以未定义的引用来自于你没有包含SQLite的源代码文件。尝试编译以下代码:

gcc -O3 sqliteTest.c sqlite3.c -o sqliteTest -lpthread -ldl

5
SQLite是一个仅提供源代码库的产品。然而,操作系统供应商提供了预编译版本。名为"libsqlite3-dev"的软件包将sqlite3.h放入/usr/include,将libqslite3.so放入GCC能够找到的目录中。由于提问者在他的代码中使用#include <sqlite3.h>,而不是#include "sqlite3.h",他正在尝试使用系统版本,而他下载源代码的事实是可以忽略的红色干扰。或者,他应该按照你的建议去做,但同时他也应该使用#include "sqlite3.h"而不是#include <sqlite3.h> - This isn't my real name
1
@ElchononEdelson:提问者在问题的最后一部分尝试更改为#include“sqlite3.h”。但有趣的是,Mint提供了预编译版本。 - Siyuan Ren
啊,我错过了那个。好观点。是的,只要他在做“sqlite.h”,他应该将sqlite3.c添加到编译中,而不是使用“-lsqlite3”进行链接,就像你说的那样。此外,我认为几乎每个Linux都提供了这个库的预编译版本(以及其他大量库)。实际上,即使产品制造商提供构建,主要发行版也会更喜欢提供自己的构建,因为这样他们可以根据自己的操作系统布局和哲学进行定制。(以及他们自己的错误修复和类似的东西...) - This isn't my real name
@ElchononEdelson 实际上,我尝试的顺序是首先下载 sqlite-amalgamation-3080002.zip,因为这通常会提供更好的性能。但这没有起作用,使用拼写错误(sqlite vs sqlite3)编译也没有起作用,命令提示符中的 sqlite3 也没有起作用,所以我认为 Mint 实际上没有附带 sqlite。因此我使用了 apt-get。 - AppFzx

5

首先,你应该 #include <stdlib.h> 头文件来声明 exit() 函数,其次请记住你要链接的库名为 "sqlite3",请将你链接命令中的 -lsqlite 替换为 -lsqlite3


这就是为什么我们不会在犯困时编写代码的原因。很好的发现。但出于好奇,当我通过 #include "sqlite3.h" 包含它时,为什么它不起作用呢? - AppFzx
呀,希望我能够接受这两个答案。缺少 3 是一个明显的愚蠢错误。同时 <stdlib.h> 也很有用。 - AppFzx

0

CodeLite: 右键单击项目>设置>链接器: 1. 库搜索路径:/usr/include(sqlite3.h所在的路径); 2. 库:sqlite3; 3. 点击确定; 然后按F7重新构建项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接