2011-04-20 93 views
1

我想要得到一个基本的“hello world”sqlite3程序进入cygwin。我最初从setup.exe安装它,但是当我运行程序时,出现链接器错误,例如“对_sqlite3_open'的未定义引用”。 I编译时使用-lsqlite3开关。cygwin SQLite3导致链接器错误

的位置是在这里:

$ 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 

感谢您的帮助,您可以提供。干杯:)

回答

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在文件foo.o之后但在bar.o之前搜索库z。如果bar.o引用z中的功能,则可能不会加载这些功能。

换句话说,在您指定点,还有那么他们没有被加载任何的SQLite的功能没有尚未解决的引用。

后来,当您加载test.o时,它确实有有未解析的引用。不幸的是,既然您已经查看了SQLite3库并对其进行了折扣,它们将永远不会被解决。因此你的错误。

+0

Derp,它似乎是放置。也许这是一个cygwin的东西?我似乎没有记得之前有一个安置问题:)谢谢!我试图弄清楚为什么它没有连接哈哈。 (是的,你是对的,这是一个C++程序,只是一个错字) – Jordan 2011-04-20 02:33:05

+0

@Jordan,我不认为它只限于CygWin。完全相同的文本出现在我的Ubuntu 10.04盒子的手册页中。我想这可能是因为它是CygWin下的gcc3,但是Ubuntu中的gcc3也是gcc4。我在_many_系统上曾经遇到过这个问题_many_次,所以我认为这很常见。我们甚至曾经引入了一个kludge来修改库列表以摆脱这个问题 - 它包括复制列表的次数与列表中的单个库相同:所以'-la'或'-la -lb -la - Ib'或'-la -lb -lc -la -lb -lc -la -lb -lc'等等。 – paxdiablo 2011-04-20 02:38:55

1

你可能需要您的图书馆在命令的末尾:

gcc test.cc -lsqlite3 

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