【问题标题】:Problems linking to sqlite3.h with gcc使用 gcc 链接到 sqlite3.h 的问题
【发布时间】:2013-09-17 13:55:49
【问题描述】:

我正在使用 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

我把&lt;sqlite3.h&gt;改成"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

我被难住了……接下来我该怎么做?

【问题讨论】:

    标签: c gcc sqlite linker


    【解决方案1】:

    嗯,首先你应该#include &lt;stdlib.h&gt; 在范围内有一个适当的exit() 声明,其次你应该记住你要链接的东西被命名为“sqlite3”,并替换-lsqlite您与-lsqlite3 的链接行。

    【讨论】:

    • 这就是我们睡着时不编码的原因。接得好。不过出于好奇:为什么当我通过 #include "sqlite3.h" 包含时它不起作用?
    • 呸,希望我能接受这两个答案。缺少3 是一个明显的愚蠢错误。 也很有用。
    【解决方案2】:

    SQLite 是一个仅限源代码的库。您将源代码嵌入到应用程序中,而不是与其链接。所以未定义的引用来自于你没有包含sqlite的源文件。尝试编译为

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

    【讨论】:

    • SQLite 是生产者提供的纯源库。但是,操作系统供应商提供了预编译版本。名为“libsqlite3-dev”的包将sqlite3.h 放入/usr/include,并将libqslite3.so 放入GCC 可以找到它的目录中。由于提问者在他的代码中使用#include &lt;sqlite3.h&gt;,而不是#include "sqlite3.h",因此他正在尝试使用系统版本,而且他还下载了源代码这一事实是一个可忽略的红鲱鱼。或者,他应该按照您推荐的方式进行操作,但他也应该#include "sqlite3.h" 而不是#include &lt;sqlite3.h&gt;
    • @ElchononEdelson:提问者在问题的最后部分尝试更改为#include "sqlite3.h"。但有趣的是,Mint 提供了预编译版本。
    • 啊,我错过了。好点子。是的,只要他在做"sqlite.h",他就应该将 sqlite3.c 添加到他的编译中,而不是与-lsqlite3 链接,就像你说的那样。另外,我认为几乎每个 Linux 都提供了这个库的预编译(以及大量其他库)。事实上,即使产品的制造商提供构建,主要发行版也更愿意提供自己的构建,因为这样他们可以自定义它以符合他们的操作系统布局和理念。 (还有他们自己的错误修正和类似的东西......)
    • @ElchononEdelson 实际上,我尝试的顺序是首先下载sqlite-amalgamation-3080002.zip,因为这通常会提供更好的性能。那没有用,并且用错字编译(sqlite vs sqlite3)没有用,命令提示符下的 sqlite3 也没有用,所以我认为 Mint 实际上没有附带 sqlite。因此我做了apt-get。
    【解决方案3】:

    代码精简版: 右键单击项目>设置>链接器: 1.库搜索路径:/usr/include(sqlite3.h所在路径); 2. 库:sqlite3 3. 按确定 和 F7 重建项目

    【讨论】:

      【解决方案4】:

      这行得通

      gcc ./sqliteTest.c -o sqliteTest -lsqlite3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 2010-09-17
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多