cygwin中的SQLite3导致链接器错误

时间:2011-04-20 02:01:26

标签: c++ sqlite linker cygwin

我正在尝试在cygwin中获得一个基本的“hello world”sqlite3程序。我最初是从setup.exe安装的,但是当我运行程序时,我遇到了链接器错误,例如“未定义引用`_sqlite3_open'”。我 AM 在编译时使用-lsqlite3开关。

位置在这里:

$ ls /usr/lib/ | grep sql
libsqlite3.a
libsqlite3.dll.a
libsqlite3.la

然后我尝试下载sqlite3源并手动编译它,但我得到了同样的错误。它安装在/ usr / local / lib

$ ls /usr/local/lib/ | grep sql
libsqlite3.a
libsqlite3.dll.a
libsqlite3.la

我仍然会收到这些链接器错误,我似乎无法弄清楚如何修复它?

$ gcc -lsqlite3 test.cc
test.cc: In function ‘int main()’:
test.cc:41: warning: deprecated conversion from string constant to ‘char*’
/tmp/ccKA3ZFa.o:test.cc:(.text+0x2d): undefined reference to `_sqlite3_open'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x41): undefined reference to `_sqlite3_errmsg'
/tmp/ccKA3ZFa.o:test.cc:(.text+0xb6): undefined reference to `_sqlite3_prepare_v2'
/tmp/ccKA3ZFa.o:test.cc:(.text+0xca): undefined reference to `_sqlite3_errmsg'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x10e): undefined reference to `_sqlite3_step'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x12a): undefined reference to `_sqlite3_column_bytes'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x140): undefined reference to `_sqlite3_column_text'
/tmp/ccKA3ZFa.o:test.cc:(.eh_frame+0x11): undefined reference to `___gxx_personality_v0'
collect2: ld returned 1 exit status

感谢您提供的任何帮助。干杯:)

2 个答案:

答案 0 :(得分:3)

这是导致您出现问题的-l选项的展示位置。请尝试执行此操作:

gcc test.cc -lsqlite3

根据以下成绩单:

pax$ cat qq.c
#include <sqlite3.h>
int main (void) {
        sqlite3 *x;
        sqlite3_open("db", &x);
        return 0;
}

pax$ gcc -L/usr/lib -lsqlite3 -o qq qq.c
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccmgVbDt.o:
    qq.c:(.text+0x25): undefined reference to `_sqlite3_open'
collect2: ld returned 1 exit status

pax$ gcc -L/usr/lib -o qq qq.c -lsqlite3

pax$ _

您可以看到,当-l 跟随其他参数时,没有链接器错误。

手册页中的相关位是(在-l的描述下):

  

在您编写此选项的命令中,它会有所不同;链接器搜索和   按指定的顺序处理库和目标文件。因此,foo.o -lz bar.o在文件z之后但foo.o之前搜索库bar.o。如果bar.o引用z中的函数,则可能无法加载这些函数。

换句话说,在您指定-lsqlite3的位置,有没有未解析的任何SQLite函数的引用,因此没有加载它们。

稍后,当您加载test.o时, 会有未解析的引用。不幸的是,既然您已经查看了SQLite3库并对其打了折扣,那么它们将永远无法解决。因此你的错误。

答案 1 :(得分:1)

您可能需要在命令末尾使用您的库:

gcc test.cc -lsqlite3

链接器通常从左到右搜索符号,SQLite符号在test.cc中引用,但在libsqlite3.a中定义。