我正在尝试在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
感谢您提供的任何帮助。干杯:)
答案 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
中定义。